1

私はすでに 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|

誰かが私を正しい方向に向けることができれば幸いです!

4

2 に答える 2

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);
}
于 2012-10-26T15:13:21.503 に答える
0

文字列に複数のバイト文字が含まれている可能性があります。試してみてくださいmb_strlen

于 2012-10-26T14:42:09.847 に答える