2011-05-30 23 views
5

से PHP में कम महत्वपूर्ण बिट प्राप्त करें मेरे पास हेक्स कोड वाला एक फ़ाइल है और मुझे फ़ाइल में प्रत्येक बाइट से कम से कम महत्वपूर्ण बिट्स प्राप्त करने की आवश्यकता है, उन्हें संयोजित करें, उन्हें 8 के समूहों में विभाजित करें और फिर बाइट्स को कन्वर्ट करें ASCII। मेरी समस्या एलएसबी को हर बाइट से निकालना है।हेक्स

हेक्स फ़ाइल इस तरह दिखता है (लेकिन है बहुत लंबे समय तक):

<?php 
// Read file, remove spaces 
$file = implode('', explode(' ', file_get_contents('vogel.hex'))); 

// Save LSB 
$bits = array(); 
for ($i = 1; $i < strlen($file); ++$i) 
{ 
    $bits[] = $file[$i] & 1; 
} 

// Split LSB array into chunks of 8 bits. 
$bytes = array_chunk($bits, 8); 

// Implode byte arrays, convert to decimal, convert to ASCII. 
foreach ($bytes as $byte) 
{ 
echo chr(bindec(implode('', $byte))); 
} 
?> 

मुझे लगता है कि बंटवारे और परिवर्तित हिस्सा सही ढंग से काम करना चाहिए, लेकिन:

58 00 00 1F 58 00 00 00 00 00 00 00 00 00 00 1C 22 23 1F 26 25 1E 2C 26 20 31 2B 22 38 2F 26 42 36 25 47 37 24 49 39 22 

मेरे कोड इस तरह दिखता है मुझे लगता है कि मैंने एलएसबी निकालने पर गलती की है। क्या कोई उदाहरण दे सकता है कि मैं एलएसबी कैसे निकाल सकता हूं?

मैंने थोड़ा कोड संपादित किया, ताकि मैं स्थिति 1 पर बिट्स पढ़ना शुरू कर दूं। फिर दशमलव प्रतिनिधित्व ASCII रेंज के भीतर है और स्क्रिप्ट एक वास्तविक ASCII चरित्र आउटपुट करता है।

उत्तर

1

आप बस ऊपर बिट श्रृंखला के भीतर पाश के लिए बना सकते हैं, पूरे सरणी प्रक्रिया लंघन:

$bits = ''; 
for ($i = 1; $i < strlen($file); $i++) { 
    $bits .= (($file[$i] & 1) == 0) ? '0' : '1'; 
    if ($i % 8 == 0) { 
     echo bindec($bits); 
     $bits = ''; 
    } 
} 
बेशक

, आप कुछ झूलने बिट्स अगर इनपुट फ़ाइल के आकार गुणक नहीं होगा 8.

+0

कोड केवल एक समय के उद्देश्य के लिए है, इसलिए मुझे गति या अच्छा परवाह नहीं है। लेकिन मेरे पास एक प्रश्न है। आप इंडेक्स 1 के साथ लूप क्यों शुरू करते हैं और क्या इससे कोई फर्क पड़ता है कि रिक्त स्थान अभी भी $ फ़ाइल स्ट्रिंग के अंदर हैं? –

+0

उस समय मैंने अपना जवाब लिखा था कि आपका लूप 0 से शुरू हुआ था, और अनुमान लगाया गया था कि मुझे लूप परिभाषा में पूर्व-वृद्धि ('++ $ i') द्वारा फेंक दिया गया था। –

1

हेक्सावल्यू/2 बार के लिए हेक्स को स्थानांतरित करने के बारे में क्या?

$hex = 0x05; 
$shiftVal = (0 + $hex)/2; 
echo $hex>>$shiftVal;//should output 1 

एक और दृष्टिकोण एक नंबर करने के हेक्स बदलने और देखने के लिए है अगर यह अजीब है या यहां तक ​​कि:

$hex = 0xad; 
echo $hex%2; 
+0

क्या मुझे इसे हर चरित्र में लागू करने की ज़रूरत है? इस प्रकार यदि इनपुट '42 4 डी' है, तो क्या मैं' 42' और '4 डी' पर आवेदन करता हूं या क्या मैं' 4', '2',' 4' और 'डी' पर लागू होता हूं? –

+0

एक हेक्स संख्या को 2 वर्णों के समूह द्वारा दर्शाया जाता है .. इसलिए आपको इसे '42' और '4 डी' पर लागू करना चाहिए, प्रत्येक चार्ट को अलग-अलग –

+0

@ फ्लोरियन एकरस्टोरफर में नहीं जोड़ा जाना चाहिए: एक और तरीका जोड़ा गया। देखें –

1

प्रोग्रामर का एक बहुत अपने समाधान में चापलूसी सकता है, लेकिन यह दोनों ASCII साथ बस ठीक काम करता है और EBCDIC। मैं किसी भी अन्य चरित्र सेट के बारे में नहीं जानता जो शायद संभवतः PHP के साथ उपयोग कर रहा हो।

चरित्र अंक का कम से कम महत्वपूर्ण बिट यह मानता है कि यह मानता है। तो आपका कोड काम करेगा। लेकिन यह वास्तव में एक टिप्पणी देने का हकदार है कि यह एएससीआईआई/ईबीसीडीआईसी डिस्प्ले कोड के कम से कम महत्वपूर्ण बिट पर अंक के समान ही निर्भर करता है।

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