在PHP中计算Modulo 256校验和

我已经搜索了Stackoverflow并且不幸没有出现。我正在使用FIX协议,我需要生成一个Modulo 256校验和,如http://fixwiki.fixprotocol.org/fixwiki/CheckSum所述。在PHP中计算Modulo 256校验和

$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 | 34 = 12 | 52 = 20100304-07:59 :30

它应该返回:

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

但是我的脚本返回:

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

如果有人能指引我走向正确的方向,我将不胜感激!

回答:

根据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);

}

回答:

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

以上是 在PHP中计算Modulo 256校验和 的全部内容, 来源链接: utcz.com/qa/266788.html

回到顶部