0

ネットワークベースのプロトコルにCRC検証を実装しようとしています。CRC計算は、PyCRCライブラリを介して行われます。

PyCRCは、指定されたパケットのチェックサムを生成し、次のような結果を返します。CB3D9FD1

私がそれをネットワークで送信しようとすると、どういうわけかpythonが私の文字列を変更し、ASCIIで16進数に変換します。例:

Crc = "CB3D9FD1"
...
buffer = "\x41\x42\x43\x44"+crc
...
s.send(buffer)

ワイヤー上で私はそれを見るでしょう:

\x41\x42\x43\x44***\x43\x42\x33\x44\x39\x46\x44\x31***

それ以外の:

 \x41\x42\x43\x44***\xCB\x3D\x9F\xD1***

この問題を簡単に解決する方法はありますか?

ありがとう !

4

3 に答える 3

2

実際には、CRCをASCIIに変換しないでください。16進数で保持し、 struct.pack ::を使用してバイト文字列にパックします。

buffer += struct.pack("L", crc)
于 2011-12-29T19:18:22.357 に答える
0

CRCを「CB3D9FD1」を含む文字列に変換した場合、正しいバイトシーケンスは0x43 0x42 0x33 0x44 0x39 0x460x440x31です。叫び声を文字列に変換したり、文字列を16進数(各バイトに2文字)として解析したりしないでください。

于 2011-12-29T19:23:34.327 に答える
0

このように割り当てることによりcrc = "CB3D9FD1"、varcrcを8バイトの文字列にするということです。@Bashworkが言うように、16進文字列から数値に変換するか、数値を維持する必要があります。数値を取得するには、次のように0xを割り当てますcrc=0xCB3D9FD1

pack( "L"、x)は、整数である(必須の)xを指定していることを意味し、 unsignedlongとしてパックしてほしい。pack( "L"、...)に文字列 "CB3D9FD1"を渡したため、"struct.error:引数を整数に変換できません"
が表示されます。

RTFM「L」と「I」およびその他の引数の意味:https ://docs.python.org/2/library/struct.html

長整数が機能するようにCRCをパックします。64ビットに0がパディングされます(私のPCではYMMV)

>>> from struct import pack
>>> crc=0xcb3d9fd1
>>> repr(crc)
'3409813457'
>>> pack("L", crc)
'\xd1\x9f=\xcb\x00\x00\x00\x00'
>>> print crc
3409813457

たぶんあなたはpack( "I"、...)を使いたいでしょう:32ビットを取得するために

>>> pack("I",crc)
'\xd1\x9f=\xcb'

pack( "L"、...)を使用してCRC文字列をパックしようとすると失敗します。

>>> crc = "CB3D9FD1"
>>> repr(crc)
"'CB3D9FD1'"
>>> pack("L", crc)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: cannot convert argument to integer
于 2016-06-14T15:05:16.740 に答える