我已经搜索过Stackoverflow,很遗憾没有出现任何问题。我正在使用FIX协议,我需要按http://fixwiki.fixprotocol.org/fixwiki/CheckSum所述生成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 |
如果有人能指出我正确的方向,我将不胜感激!
答案 0 :(得分:4)
根据http://fixwiki.fixprotocol.org/fixwiki/CheckSum,校验和不仅仅是消息模256的长度 它是模数256的每个字符(ascii值)的总和。
<?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);
}
答案 1 :(得分:0)
您的字符串可能有多个字节字符。试试mb_strlen
。