在PHP中计算Modulo 256校验和

在PHP中计算Modulo 256校验和

问题描述:

我已经搜索了*并且不幸没有出现。我正在使用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 |

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

+0

检查这个帖子http://*.com/questions/2959788/good-tutorial-about-the-fix-protocol – F*oLothor

+0

我确实有看看那个线程,但我看不到任何特定的计算我需要以上。 – Ashley

+0

$ count的值是多少? – F*oLothor

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

谢谢你!作品一种享受! – Ashley

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

+0

我同时回显strlen()和mb_strlen(),并且上面的示例都返回56。 – Ashley

+0

这实际上是57,我在复制示例时错过了一个管道。 – Ashley