2017-03-27 5 views
0

C++には、符号なし文字の配列があり、そのすべての位置には、16進数値のarray[0] = 0xFF; array[1] = 0x2A; array[2] = 0x33;などがあります。次に、チェックサムを作成する関数があります。PHP 16進数の文字列を操作して合計する

unsigned char checksum = 0xFF; 
for (i = 0; i <= array.size(); i++) 
    checksum -= array[i]; 

これは問題なく動作しますが、コードをPHPに移行する必要があります。

最初に見つかった問題は、アレイではなく、$string = "\xFF\x2A\x33";のような16進文字列を使用していました。なぜなら、dio_writeを使用してシリアルポート経由で書き込む必要があるからです。私はこのコードを試しました:

$checksum = "\xFF"; 
for ($i = 0; $i < strlen($array); $i++) 
    $checksum -= $array[$i]; 

しかし、PHPはちょうど...このように動作しません。 $checksumの値は変更されません。だから私は、これは、チェックサムを修正

$checksum = 255; 
for ($i = 0; $i < strlen($array); $i++) 
     $checksum -= ord($array[$i]); 

に番号を文字列から変換しようとしたが、その後私は、16進数の文字列に追加する必要があり、それが...署名されています。私は最終的にunsigned char型を作る方法を発見し、私が試した最後のコードは

$checksum = pack("C", "\xFF"); 
$sum = 0; 
for ($i = 0; $i < strlen($array); $i++) 
     $sum += ord($array[$i]); 
$checksum = pack("C", ord($checksum) - $sum); 

されましたが、それはちょうど私に間違ったチェックサムを与えています。私は間違って何をしていますか?

答えて

0

さて、最終的にはこれが働いた:

$checksum = unpack("C", "\xFF"); 
$sum = 0; 
for ($i = 0; $i < strlen($string); $i++) 
    $sum += unpack("C",$string[$i])[1]; 
$checksum = pack("C",$checksum[1]-$sum); 
関連する問題