1

unsigned int 32にキャストする必要がある3バイトのバイトストリームがあります。CIでは、bzeroを使用して整数のメモリ領域をゼロにし、ストリームからメモリをコピーします。

char* stream = ...;
Uint32 myInt;
bzero(myInt,4);
memcopy(myInt, stream[0], stream[3])

質問:

Pythonでこれを行うにはどうすればよいですか?

乾杯

4

3 に答える 3

3

Cでも、memcpyエンディアン、符号などのバイナリ表現を処理しないため、バイナリの逆シリアル化には使用しないでください。ストリーム内の固定表現からプラットフォームのネイティブ表現にバイナリ値を明示的にデコードします。

Pythonでは、ストリームからバイトを読み取り、エンディアンに応じてパディングしてから、次のコマンドで解凍しますstruct

chunk = fileobj.read(3)
# decode bytes as little-endian, signed integer
chunk += '\x00'
number = struct.unpack('<i', chunk)

fileobjはファイルのようなオブジェクトであり、開かれたストリーム、つまり。で開かれたファイルを表しますopen(filename, 'rb')

于 2012-08-01T07:39:14.997 に答える
1

やってみました:

myInt = (ord (myStr[0]) * 256 + ord (myStr[1])) * 256 + ord (myStr[2])

次のプログラム:

myStr = "abc"
myInt = ord (myStr[0]) * 65536 + ord (myStr[1]) * 256 + ord (myStr[2])
print myInt

期待どおりの出力6382179

'a' (97) * 65536 = 6356992
'b' (98) *   256 =   25088
'c' (99) *     1 =      99
                   -------
                   6382179

もちろん、これは文字列がビッグエンディアン形式であると想定しています。最も重要なオクテットが文字列の3番目であるリトルエンディアンの場合、 (2, 1, 0ではなく)文字列インデックスを逆にすることができます0, 1, 2

于 2012-08-01T07:33:46.040 に答える
0

@paxdiabloが言うように、それordが解決策です。<<これは、 Cに慣れるためのソリューションです。

sum([ord(c) << 8 * i for i, c in enumerate(s) ])
于 2012-08-01T07:43:17.057 に答える