用PHP计算模256校验和

用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 |

我已经搜索过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|


如果有人能给我指出正确的方向,我将不胜感激

您的字符串可能有多个字节字符。请尝试
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,谢谢!真是一种享受!谢谢你!真是一种享受!