python二进制解析strut.upack的错误unpack requires a string argument of length 4
2017-07-28 08:51
555 查看
转自:http://blog.csdn.net/wxl2578/article/details/51511401
报错内容为:unpack requires a string argument of length 4
通常遇到该种错误一般是字节没有对齐,比如
struct.unpack("i",self.dexFile.read(2))[0]
int类型需要四个字节,而只读取了两个,则会报错,
刚用该模块解析dex文件时发现,读取到一定量的数据后会报上面错误,查看读取代码并无错误
struct.unpack("i",self.dexFile.read(4))[0]
后来发现打开文件时,用了'r'模式而非‘rb’,将代码
f=open(filepath,'r')
修改为
f=open(filepath,'rb')
问题得以解决!
这两个方式的区别在于对‘0x1A’和‘0x0A’的处理,下面转载:
第一,使用'r'的时候如果碰到'0x1A',就会视为文件结束,这就是EOF。使用'rb'则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在'0X1A',就只会读出文件的一部分。使用'rb'的时候会一直读到文件末尾。
第二,对于字符串x='abc\ndef',我们可用len(x)得到它的长度为7,\n我们称之为换行符,实际上是'0X0A'。当我们用'w'即文本方式写的时候,在windows平台上会自动将'0X0A'变成两个字符'0X0D','0X0A',即文件长度实际上变成8.。当用'r'文本方式读取时,又自动的转换成原来的换行符。如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0X0D'又称回车符。
linux下不会变。因为linux只使用'0X0A'来表示换行。
报错内容为:unpack requires a string argument of length 4
通常遇到该种错误一般是字节没有对齐,比如
struct.unpack("i",self.dexFile.read(2))[0]
int类型需要四个字节,而只读取了两个,则会报错,
刚用该模块解析dex文件时发现,读取到一定量的数据后会报上面错误,查看读取代码并无错误
struct.unpack("i",self.dexFile.read(4))[0]
后来发现打开文件时,用了'r'模式而非‘rb’,将代码
f=open(filepath,'r')
修改为
f=open(filepath,'rb')
问题得以解决!
这两个方式的区别在于对‘0x1A’和‘0x0A’的处理,下面转载:
第一,使用'r'的时候如果碰到'0x1A',就会视为文件结束,这就是EOF。使用'rb'则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在'0X1A',就只会读出文件的一部分。使用'rb'的时候会一直读到文件末尾。
第二,对于字符串x='abc\ndef',我们可用len(x)得到它的长度为7,\n我们称之为换行符,实际上是'0X0A'。当我们用'w'即文本方式写的时候,在windows平台上会自动将'0X0A'变成两个字符'0X0D','0X0A',即文件长度实际上变成8.。当用'r'文本方式读取时,又自动的转换成原来的换行符。如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0X0D'又称回车符。
linux下不会变。因为linux只使用'0X0A'来表示换行。
相关文章推荐
- python二进制解析strut.upack的错误unpack requires a string argument of length 4
- python——unpack问题 ocr_recognize timeout , exception:unpack requires a string argument of length 46
- struct.error: unpack requires a string argument of length 4
- struct.error: unpack requires a string argument of length 4
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制--pack,unpack
- python:PyInstaller打包发布单个文件错误struct.error: argument for 's' must be a string解决
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- The internals of Python string interning(关于字符串is比较两个字符串对象的深度解析)
- Python使用struct处理二进制(pack和unpack用法)
- python-rrdtool创建rrd文件的TypeError: argument 0 must be string 错误
- python PIL, 错误:IndexError: string index out of range
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)