2015-08-06 4 views
6

मैं रेडिस में परिणाम स्ट्रिंग को रखते हुए, बड़ी संख्या में बिट झंडे में हेरफेर करने के लिए एक लंबी स्ट्रिंग का उपयोग करने जा रहा था। हालांकि, एक php बग (?) पर ठोकर खाई।PHP substr() ASCII कैरिज रिटर्न बाइट क्यों बदलता है?

$bin = 0b00001101; // 13 - ASCII Carriage return 
$c = substr($bin, 0, 1); // read this character 
printf("Expectation: 00001101, reality: %08b\n", $c); // 00000001 

Ideone

धारणा substr() बाइनरी सुरक्षित गलत है है: एक बाइट कि बिट्स substr() का उपयोग करके पढ़ा 00001101 शामिल एक अप्रत्याशित मान देता है? mb_substr() भी कोशिश की, उसी परिणाम के साथ 8bit पर एन्कोडिंग सेटिंग।

उत्तर

4

आप एक पूर्णांक13

का उपयोग के खिलाफ substr() एक स्ट्रिंग ("13")

आपको लगता है कि श्रृंखला का पहला चरित्र पढ़ रहे हैं उससे कास्टिंग है करने के लिए स्थापित कर रहे हैं ("1")

printf() का उपयोगके साथ 0, आप स्पष्ट रूप से उस स्ट्रिंग को पूर्णांक 1

तर्क को पूर्णांक के रूप में माना जाता है, और बाइनरी संख्या के रूप में प्रस्तुत किया जाता है।

संपादित

इस कोड नतीजा यह है कि आप उम्मीद कर रहे हैं

$bin = 0b00001101; // 13 - ASCII Carriage return 
$c = substr(chr($bin), 0, 1); // read this character 
printf("Expectation: 00001101, reality: %08b\n", ord($c)); // 00001101 
+0

धन्यवाद देना चाहिए! शायद मैंने समस्या का एक बुरा उदाहरण/अलगाव बनाया है। मूल रूप से मेरे पास एक बाइनरी स्ट्रिंग है, जो इससे एक विशेष बाइट पढ़ रही है। उदाहरण को फिर से लिखना होगा। – Serge

+0

सच है, अब मुझे यह मिल गया है। एक बार फिर धन्यवाद! – Serge

संबंधित मुद्दे