用PHP计算模256校验和
我已经搜索过Stackoverflow了,不幸的是什么也没找到。我正在使用FIX协议,需要生成一个模256校验和,如中所述 使用以下的修复字符串: 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|用PHP计算模256校验和,php,modulo,fix-protocol,Php,Modulo,Fix Protocol,我已经搜索过Stackoverflow了,不幸的是什么也没找到。我正在使用FIX协议,需要生成一个模256校验和,如中所述 使用以下的修复字符串: 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 |
如果有人能给我指出正确的方向,我将不胜感激 您的字符串可能有多个字节字符。请尝试
mb_strlen
您的字符串可能有多个字节字符。尝试mb_strlen
,因为校验和不仅仅是消息长度的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);
}
或者更接近文档中的示例函数
<?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);
}
根据校验和,校验和不仅仅是消息长度的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);
}
或者更接近文档中的示例函数
<?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);
}
我同时回显了strlen()和mb_strlen(),并在上面的示例中返回56。实际上是57,我在复制示例时遗漏了一个管道。我同时回显了strlen()和mb_strlen(),并在上面的示例中返回56。实际上是57,复制示例时,我遗漏了一个管道。查看这篇文章,我确实查看了该线程,但我看不到任何与上面需要的计算相关的内容。使用strlen()和mb_strlen()计算,$count的值为57查看这篇文章,我确实看过那个线程,但我看不到上面需要的任何特定计算。使用strlen()和mb_strlen()计算$count的值是57,谢谢!真是一种享受!谢谢你!真是一种享受!