在PHP中计算模256校验和

qc6wkl3g  于 2023-03-22  发布在  PHP
关注(0)|答案(3)|浏览(195)

我已经搜索了Stackoverflow,不幸的是什么都没有出现。我正在使用FIX协议,我需要生成一个模256校验和,如http://fixwiki.fixprotocol.org/fixwiki/CheckSum所述。

$count = strlen($message);
$count = $count % 256;
$checksum = 256 - $count;

if(strlen($checksum) == 1) {
    $checksum = '00' . $checksum;   
}

if(strlen($checksum) == 2) {
    $checksum = '0' . $checksum;    
}

使用FIX字符串:
8=FIX.4.2|9=42|35=0|49=A|56=B|三十四=十二|52=20100304-07:59:30
它应返回:
8=FIX.4.2|9=42|35=0|49=A|56=B|三十四=十二|52=20100304-07:59:30|10=185|
但是我的脚本返回:
8=FIX.4.2|9=42|35=0|49=A|56=B|三十四=十二|52=20100304-07:59:30|10=199|
如果有人能给我指出正确的方向,我将不胜感激!

zf9nrax1

zf9nrax11#

根据http://fixwiki.fixprotocol.org/fixwiki/CheckSum,校验和不仅仅是消息的长度模256。
它是每个字符(作为ascii值)模256的和。

<?php
define('SOH', chr(0x01));

$message = '8=FIX.4.2|9=42|35=0|49=A|56=B|34=12|52=20100304-07:59:30|';
$message = str_replace('|', SOH, $message);
echo $message, GenerateCheckSum($message);

function GenerateCheckSum($message) {
    $sum = array_sum(
        array_map(
            'ord', 
            str_split($message, 1)
        )
    );
    $sum %= 256;
    return sprintf('10=%03d%s', $sum, SOH);
}

印刷品

8=FIX.4.2 9=42 35=0 49=A 56=B 34=12 52=20100304-07:59:30 10=185

或者更接近文档中的示例函数

<?php
define('SOH', chr(0x01));

$message = '8=FIX.4.2|9=42|35=0|49=A|56=B|34=12|52=20100304-07:59:30|';
$message = str_replace('|', SOH, $message);
echo $message, '10=', GenerateCheckSum($message, strlen($message)), SOH;

function GenerateCheckSum($buf, $bufLen )
{
   for( $idx=0, $cks=0; $idx < $bufLen; $cks += ord($buf[ $idx++ ]) );
   return sprintf( "%03d", $cks % 256);
}
shstlldc

shstlldc2#

你的字符串可能有多个字节字符。试试mb_strlen

dojqjjoe

dojqjjoe3#

此函数适用于十六进制输入:

public function calculate_checksum($hex){

$bufLen = strlen($hex);
$sum_dec = 0;

for ($i=0; $i < $bufLen; $i+=2){
    echo substr($hex, $i, 2);
    $sum_dec += hexdec(substr($hex, $i, 2));
}

echo dechex(($sum_dec % 256));

}

相关问题