使用struct将char填充到python中的字节

时间:2018-06-19 01:07:49

标签: python struct unicode byte

我正在尝试使用struct包将char填充到python的字节,但是我的代码在使用此代码打包char时不会返回4个字节:

def charToHex(s):
#check if string is unicode
if isinstance(s, str):
    print(struct.pack('<c', 'a'.encode(encoding='utf-8')))
    return '{:02x}'.format(struct.unpack('<I', struct.pack('<c', s.encode('utf-8')))[0])

#check if input is already a byte
elif isinstance(s, bytes):
    return '{:02x}'.format(struct.unpack('<I', struct.pack('<c', s))[0])

else:
    raise Exception()

任何人都可以向我解释为什么这不起作用?我只是尝试将unicode char转换为4个字节并解压缩,但它甚至无法正确打包。

1 个答案:

答案 0 :(得分:1)

c format在单个字节的C意义上是char,而不是Python代码点的Python意义。

同时,UTF-8的全部意义在于它的宽度可变。字符可以编码为1到4个字节的任何内容。因此,您无法将其打包成c。您可以将其填充到4个字节,然后将其打包成4cI或其他东西,但这是一件非常愚蠢的事情。

如果你想为每个字符使用恰好4个字节,那么使用UTF-32要简单得多。或者,由于单个字符的UTF-32编码只是Unicode代码点的4字节int,这与ord返回的完全相同,您可以跳过encode步骤。

对于单个字符bytes确实有意义打包为c - 但是将它解压缩为{{1}是没有意义的}。

事实上,目前尚不清楚您在这里使用i的内容。如果您要做的只是struct一个数字和pack相同的数字,请按原样使用该数字。

同时,unpack作为4字节整数的格式没有多大意义,因为4字节整数需要8个十六进制数字,而不是2。

所以,你可能想要的是这样的:

02x