- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Python 读取和解析二进制文件。
问题是文件中的数据可以是小端或大端格式,以及 32 位或 64 位值。在文件头中有几个字节指定数据格式和大小。假设我已阅读这些内容并且知道格式和大小,并且我尝试按如下方式构造格式字符串:
if (bitOrder == 1): # little-endian format
strData = '<'
elif (bitOrder == 2): # bit-endian format
strData = '>'
if (dataSize == 1): # 32-bit data
strLen = 'L'
elif (dataSize == 2):
strLen = 'q'
strFormat = strData + strLen
struct.unpack(strFormat, buf)
当我这样做时,我收到错误:"struct.error: unpack requires a string argument of length 2"
,但如果我写 struct.unpack('<L', buf)
我得到了预期的结果。
在交互式 shell 上,如果我运行 type(strFormat)
我得到结果<type, 'str'>
当我运行len(strFormat)
时我得到的结果是 2
.
作为 Python 新手,我有以下问题:
不是str
和字符串一样吗?如果不是,如何在两者之间进行转换?
如何正确构造用于 unpack
的格式字符串功能?
------编辑------处理评论:
由于其他项目的限制,我目前使用的是 python-2.7。
我试图避免发布我的代码(它有几百行长),但是这里有一个交互 python(从 emacs 内部运行,如果这很重要),它显示了我正在经历的行为:
Python 2.7.5 (default, Jun 17 2014, 18:11:42)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> >>> >>>
>>> import array
>>> import struct
>>> header = array.array('B',[0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,0x3e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x11, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x09, 0x00, 0x40, 0x00, 0x1e, 0x00, 0x1b, 0x00])
>>> entry = header[24:32]
>>> phoff = header[32:40]
>>> shoff = header[40:48]
>>> strData = '<'
>>> strLen = 'H'
>>> strFormat = strData + strLen
>>> print strFormat
<H
>>> type(strFormat)
<type 'str'>
>>> len(strFormat)
2
>>> temp = struct.unpack(strFormat, entry)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: unpack requires a string argument of length 2
>>>
修复了原始代码中的类型。
最佳答案
根据交互式 session ,您的问题似乎是这样的:
temp = struct.unpack(strFormat, entry)
之前,您说过:
entry = header[24:32]
entry
是 8 个字节长,但 strFormat
说它应该是 2 个字节长。这就是 struct
所提示的。
它也应该是一个 bytes
对象(2.x 下的 str
),而不是 array.array
。
关于python - 如何以编程方式构造 struct.unpack 的格式字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240767/
dependencies:unpack-dependencies 可以解压哪些存档格式?例如,据我所知,它无法解压 RPM 包。是否有它支持的格式列表?有什么技巧可以让 maven 解压 RPM 包吗
谁能给我解释一下为什么在 test1 上,nums 是 [[0,0],[-1,-1],[0,0],[0,0]] 而不是在测试2上?据我了解,python for xx in xxx 与任何其他语言中的
我想按照建议在 php 中读取一个二进制文件作为字节 [] here我 unpack 'ed fread 的输出。所以我有类似的东西: $file=fopen($filename,'r'); fsee
首先,很抱歉是否已经提出并回答了这个问题,但我认为我的情况与我一直试图找到的其他答案有所不同。另外,我对C++还是很陌生。 我基本上是想创建一个系统,其中C++程序从游戏中接收数据并将其通过套接字发送
克隆 git-repo 后,当我尝试在提交后将 repo 推送到 git 服务器时。它给出的错误是“在远程端解包过程中发生 ssh 错误:解包对象异常退出” 最佳答案 检查远程仓库的所有权。 我也遇到
解决的问题 需要将数组(list)或元组(tuple)中的元素导出到N个变量中。 解决的方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要
Dim rs, ws, fso, conn, stream, connStr, theFolder
我有这个测试函数,它只是打印传递给它的值 function test1(...) for k, v in ipairs(arg) do print(v) end end func
我有以下宏: #define HEX 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 #define BITS 0x01 #define ADD_FLAGS(a, b,
我正在阅读一个套接字,在所有问题都以为我们发送了错误的信息之后,事实证明阅读存在问题。 这个想法是: 1a- Get 4 bytes, unpack (95). 2a- Get 95 next byt
我有一个返回 Sympy 点的函数: result = [Point3D(500, 500, 10), Point3D(-500, 500, 10), Point3D(-500, -500, 10),
我正在尝试存储在 std::tuple 中不同数量的值,稍后将用作调用与存储类型匹配的函数指针的参数。 我创建了一个简化示例来展示我正在努力解决的问题: #include #include voi
我正在使用 ben strasser C++ 快速 csv 解析器:https://github.com/ben-strasser/fast-cpp-csv-parser .它使用可变参数模板将列值传
我有一个由 3 个字符串组成的打包字符串,这样我就有一个整数,指定下一个项目的字节长度,然后是那个项目的字节,然后是下一个项目的字节大小,等等,就好像有人做了: [a.bytesize, a, b.b
我正在尝试存储在 std::tuple 中不同数量的值,稍后将用作调用与存储类型匹配的函数指针的参数。 我创建了一个简化的示例来展示我正在努力解决的问题: #include #include vo
我正在尝试按照 https://conda.github.io/conda-pack/index.html?highlight=conda%20unpack 中的步骤进行操作打包和解包 conda 环
我是R的新手,可以轻松地重新组织数据,并四处寻找解决方案,但找不到我想要做的事情。 Reshape2的融化/浇铸似乎不太奏效,我还没有很好地掌握plyr,因此无法将其纳入其中。 基本上,我有一个dat
希望标题不要误导。 我像往常一样在 Pandas 数据框中加载一个 Excel 文件 df = pd.read_excel('complete.xlsx') 这就是里面的东西(通常已经订购了 - 这是
这个问题在这里已经有了答案: Lua unpack() messing arguments (1 个回答) 6年前关闭。 有人可以向我解释为什么table.unpack()仅当在 table.unpa
我有一个读取二进制文件然后使用 struct.unpack() 解压文件内容的函数。我的功能工作得很好。如果/当我使用长的“格式”字符串解压缩整个文件时,它会更快。问题是有时字节对齐会发生变化,因此我
我是一名优秀的程序员,十分优秀!