python包4字节整数,字节位于bytearray struct.pack中

python包4字节整数,字节位于bytearray struct.pack中,python,struct,ascii,bytearray,Python,Struct,Ascii,Bytearray,我试图使用struct.pack将python bytearray的内容打包成一个4字节的有符号整数。不幸的是,pack需要一个字符串,所以在谷歌搜索之后,我想我需要把bytearray解码成一个字符串。我认为ascii的意思是因为ascii字符是一个字节长。不幸的是,ascii不想支持我的值>127,所以我想我应该使用replace 但当我这样做时,解码返回一个unicode类型的对象,现在我的每个字节都是一个4个字符的字符串 这似乎有点可笑,我遗漏了一些明显的东西(ps我已经使用python

我试图使用struct.pack将python bytearray的内容打包成一个4字节的有符号整数。不幸的是,pack需要一个字符串,所以在谷歌搜索之后,我想我需要把bytearray解码成一个字符串。我认为ascii的意思是因为ascii字符是一个字节长。不幸的是,ascii不想支持我的值>127,所以我想我应该使用replace

但当我这样做时,解码返回一个unicode类型的对象,现在我的每个字节都是一个4个字符的字符串

这似乎有点可笑,我遗漏了一些明显的东西(ps我已经使用python大约两周了)

这就是我要做的

    val = long(-5) 
s = bytearray(pack("<i", val)) 

s.pop() # pop off msb

# write it out the way we want to then read it in the way the code does
fout = open("test.bat", "wb")
fout.write(s) 
fout.close()

fin = open("test.bat", "rb") 

inBytes = bytearray(fin.read(3))
# extend sign bit
if (inBytes[2] & 0x80):
    inBytes.append(0xff)
else:
    inBytes.append(0x00)

nb = inBytes.decode('ascii', 'replace')
# ERROR:root:after decode, len: 4 type: <type 'unicode'>
logging.error("after decode, len: {0} type: {1}".format(len(nb), type(nb)))

# struct.error: unpack requires a string argument of length 4 
inInt32 = unpack('<i', inBytes.decode('ascii', 'replace'))[0]

fin.close()
val=long(-5)

s=bytearray(pack(“您只需将
inBytes
转换回
str

>>> inint = struct.unpack('<i', str(inBytes))
>>> inint
(-5,)

>>inint=struct.unpack(“当您以二进制模式读取文件时,您会得到一个可以立即与
struct.unpack一起使用的对象

创建输入数据:

>>> import struct
>>> f = open('foo.bin', 'wb')
>>> f.write(struct.pack('<i', -5)[:3])
3
>>> f.close()
Python3.x…它是一个
bytes
对象

>>> f = open('foo.bin', 'rb')
>>> raw = f.read()
>>> f.close()
>>> print "received", type(raw), repr(raw)
received <type 'str'> '\xfb\xff\xff'
>>> if raw[2] >= '\x80':
...     raw += '\xff'
... else:
...     raw += '\x00'
...
>>> print "extended", type(raw), repr(raw)
extended <type 'str'> '\xfb\xff\xff\xff'
>>> number = struct.unpack('<i', raw)[0]
>>> print "number", number
number -5
>>>
>>> f = open('foo.bin', 'rb')
>>> raw = f.read()
>>> f.close()
>>> print("received", type(raw), repr(raw))
received <class 'bytes'> b'\xfb\xff\xff'
>>> if raw[2] & 0x80:
...     raw += b'\xff'
... else:
...     raw += b'\x00'
...
>>> print("extended", type(raw), repr(raw))
extended <class 'bytes'> b'\xfb\xff\xff\xff'
>>> number = struct.unpack('<i', raw)[0]
>>> print("number", number)
number -5
>>>
>f=open('foo.bin','rb')
>>>raw=f.read()
>>>f.关闭()
>>>打印(“已接收”、类型(原始)、报告(原始))
已收到b'\xfb\xff\xff'
>>>如果原始[2]&0x80:
…原始+=b'\xff'
……其他:
…原始+=b'\x00'
...
>>>打印(“扩展”、类型(原始)、报告(原始))
扩展b'\xfb\xff\xff\xff'

>>>number=struct.unpack('-1对于Python2.x,最好坚持使用
str
str
->
bytearray
->
str
是令人困惑的。Python中也没有“cast”这样的概念。