Jam*_*mie 2 python arrays string
我需要通过串行连接发送一个 32 位整数,如下所示:0xc6bf6f34应该变成:b'\xc6\xbf\x6f\x34'。
为此,我创建了这一点,但是,一如既往后这种编码,我想知道,如果它的pythonicism可以与标准libary东西加以改进:
def ltonlba(value):
''' ltonlba : Long to Network Long Byte Array '''
from socket import htonl
value = htonl(value)
ba = b''
for i in range(4):
ba += chr((value) & 0xff)
value >>= 8
return ba
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 Python 3.2+,则可以使用int.to_bytes:
>>> 0xc6bf6f34.to_bytes(4, 'little') # 4 bytes = 32 bits
b'4o\xbf\xc6'
>>> 0xc6bf6f34.to_bytes(4, 'little') == b'\x34\x6f\xbf\xc6'
True
Run Code Online (Sandbox Code Playgroud)
否则,您可以使用struct.packwith <Iformat ( <: little-endian, I: 4-bytes unsigned integer ,请参阅格式字符串 -struct模块文档):
>>> import struct
>>> struct.pack('<I', 0xc6bf6f34)
b'4o\xbf\xc6'
Run Code Online (Sandbox Code Playgroud)
UPDATE /注:如果你想获得大端(或网络端),您应指定'big'具有int.to_bytes:
0xc6bf6f34.to_bytes(4, 'big') # == b'\xc6\xbf\x6f\x34'
Run Code Online (Sandbox Code Playgroud)
和>或!与struct.pack:
struct.pack('>I', 0xc6bf6f34) # == b'\xc6\xbf\x6f\x34' big-endian
struct.pack('!I', 0xc6bf6f34) # == b'\xc6\xbf\x6f\x34' network (= big-endian)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3862 次 |
| 最近记录: |