2012-06-15 220 views
3

我有以下格式的字符串:「0A1344010400010005」(十六進制表示)PHP十六進制和二進制

我需要這個字符串轉換成字節數組(0X0A,0×13,×44,等等)使這些數據可以在下面的函數中使用:

$data = $this->data; 

    for ($i = 0; $i < sizeof($data); $i++) { 

     // 1.value right shift 8 digits (equal to divide 256) 
     // 2.XOR value and incoming data, then AND 0xFF 
     // 3. get an index£¨then search related index data in CRC16_TABLE 
     // XOR again 
     $this->value = ($this->value >> 8)^$this->arr[($this->value^$data[$i]) & 0xff];   

    } 

$this->value值是0xFFFF$this->arr是一個包含元素的數組:array(0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf)

我已經完成了以下工作。基本上,這遍歷了字符串,並將每2個字符分隔爲每個字節的十六進制表示並將它們轉換爲二進制字符串。

$data = array(); 
    $len = strlen($str); 
    if($len % 2 == 1) $str = "0".$str; 
    $len = strlen($str); 
    for($i =0; $i < $len; $i=$i+2) 
    { 
     $data[] = hex2bin(substr($str,$i,2)); 
    } 
    $this->data = $data; 

看來它總是產生值爲0的結果。我應該做些什麼嗎?

非常感謝您的幫助!

回答

3

pack可以十六進制字符串轉換成二進制字符串(字節0X0A,0×13,×44,等等):

$data = pack('H*', '0A1344010400010005'); 

之後,你已經做了應該工作,只有一個小的變化:$data[$i]實際上是一個字符串,並獲得相應的字節,你需要ord值:

for ($i = 0; $i < strlen($data); $i++) { 
    $this->value = ($this->value >> 8)^$this->arr[($this->value^ord($data[$i])) & 0xFF];   
} 
+0

感謝您的回答。它有助於知道該包將有助於轉換爲十六進制二進制字符串。但是,看起來這個長度需要在'strlen($ data)'而不是'sizeof($ data)'中計算' –

+0

對於'strlen',我只是盲目複製而已。固定。 – Joni

2

hex2bin返回一個二進制字符串,你想要一個我認爲的整數。使用ORD將字符轉換爲int

$data = array(); 
$len = strlen($str); 
if($len % 2 == 1) $str = "0".$str; 
$len = strlen($str); 
for($i =0; $i < $len; $i=$i+2) 
{ 
    $data[] = ord(hex2bin(substr($str,$i,2))); 
} 
$this->data = $data; 
+0

真,邊注:PHP> = 5.4.0需要。 – bodi0

相關問題