3

次の形式の文字列があります: "0A1344010400010005"(16進表現)

これらのデータを次の関数で使用できるように、この文字列をバイトの配列(0x0a、0x13、0x44など)に変換する必要があります。

$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文字ごとに1バイトあたりの16進表現として分離し、それらを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の結果を生成しているようです。やるべきことはありますか?

助けてくれてありがとう!

4

2 に答える 2

3

pack16進文字列を2進文字列(バイト0x0a、0x13、0x44など)に変換できます。

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

その後、1つの小さな変更を加えるだけで、実行したことが機能するはず$data[$i]です。実際には文字列であり、必要な対応するバイトの値を取得するには、次のようにしますord

for ($i = 0; $i < strlen($data); $i++) {
    $this->value = ($this->value >> 8) ^ $this->arr[($this->value ^ ord($data[$i])) & 0xFF];         
}
于 2012-06-15T07:03:34.807 に答える
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;
于 2012-06-15T05:08:53.193 に答える