0

Python で C プログラムの一部の動作を模倣しようとしています。どちらも、各レコードが長さ->データであるバイナリファイルを読み取っています。C プログラムはファイルから長さバイトを取得し、それが正か負かに関係なく、ntohl() は正しい長さを返します。ただし、Python では、長さレコードが同じ値であっても、それが負の場合、OverflowError が発生します。

長さ: 419495936

トール: 281

長さ: -2147418112

OverflowError: 負の数を unsigned long に変換できません

Cと比較して:

長さ: 419495936

トール: 281

長さ: -2147418112

トール: 384

ここで何が間違っていますか?Python で C と同じ結果を生成するにはどうすればよいですか?

コードで編集

Cコードは次のとおりです。

while (fread(&rec_len, sizeof(unsigned int),  1, fp1) != 0) {
    printf("length: %d\n", rec_len);
    rec_len = ntohl(rec_len);
    printf("ntohl: %d\n", rec_len);

そして、ここにPythonがあります:

with open(file, "rb") as f:
    pSize = struct.unpack('<i', f.read(4))[0]
    print "length: " + str(pSize)
    packetSize = socket.ntohl(pSize)
    print "ntohl: " + str(packetSize)
    while packetSize > 0:
        packet = f.read(packetSize)
        pSize = struct.unpack('<i', f.read(4))[0]
        print "length: " + str(pSize)
        packetSize = socket.ntohl(pSize)
        print "ntohl: " + str(packetSize)
4

1 に答える 1

6

htonl() には正の数を渡す必要があります。値の読み取り方法を変更できない場合は、次のコードを使用できます。

>>> socket.htonl((-2147418112) & 0xffffffff)
384L

編集: コードを見て、struct.unpack を use'<I'に変更して、符号なしの数値を取得し'>I'たり'!I'、後で ntohl() の必要性を無効にしたりすることができます。

于 2012-07-18T13:08:01.787 に答える