2

5 バイトの asci 文字列を python にパックして、8 バイトでリトルエンディアンにする正しい方法は何ですか? たとえば、次のようなものです。

from struct import pack
pack('<ccccc3x', 'David')

または:

pack('<ccccc3x', b'D', b'a', b'v', b'i', b'd')
# this works but seems unreadable to me

これを行う正しい(または最も簡単な)方法は何ですか?理想的には、次のようなものです。

>>> pack('<ccccc3x', *bytearray(b'David'))

しかし、リストを渡すことも、変数のアンパックを行うこともできないようで、すべての文字に対して新しい位置引数を実行する必要があります。


私が思いつくことができる最善の方法は次のとおりですが、それを行うためのより良い方法があることを願っています。

# why won't it allow me to use `c`(har) and only `b`(yte) ?
>>> pack('<5b3x', *bytearray(b'David'))
b'David\x00\x00\x00' 

更新:これが最善の方法のようです:

>>> pack('<5s3x', b'David')
b'David\x00\x00\x00'

sページの、b、およびcのすべての異なる「文字」っぽいタイプについてはわかりませんstruct

4

1 に答える 1

2

エンディアンは、サイズが 1 バイトを超える値の場合のみなので、ここでは気にする必要はありません。

5 バイトのバイト文字列を 8 バイトにパディングする最も簡潔な方法は次のとおりです。

b'David'.ljust(8, b'\0')
于 2020-09-17T05:40:14.223 に答える