在python中打开由c程序编写为1和0的16位整数的二进制文件

Posted

技术标签:

【中文标题】在python中打开由c程序编写为1和0的16位整数的二进制文件【英文标题】:open binary file of 16 bit integers written by a c program as 1s and 0s in python 【发布时间】:2016-03-10 17:43:13 【问题描述】:

我有一个由几行组成的比特流文件。生成文件的 c 程序可执行文件将文件输出为一系列“short int”,它们实际上是 16 位整数。当我在记事本中打开文件时,我得到以下前几行:

7E1755EB7909DAC8FF4117BDAA0E86EBD1A8
1C3D47DD6606D812E8862D347288C3A251EB
16D7D02AD908E0083C142C107AB916C55BE0

我需要能够在 Python 中打开此文件并将其转换为 1 和 0,它们代表原始的“short int”,或者换句话说,一个 1 和 0 的数组。我想当我在文件中读取时,“\n”表示新行可能也有问题。

我尝试了以下代码,看看哪种方法效果最好:

import struct

filePathC = "C:\\Working\\Vocoder Sims\\ofile.chan"

fileC = open(filePathC, "rb")

with fileC:

    byteC = fileC.read(8)

    binaryC1 = bin(int(byteC,16))
    binaryC2 = struct.unpack("h" * (len(byteC)/2),byteC)

    print binaryC1
    print binaryC2

我只读取前 8 个字节的结果是:

0b1111110000101110101010111101011
(17719, 14129, 13621, 16965)

第一个结果的问题是我应该得到 64 个 1 和 0,而第二个结果的问题是它是“元组”而不是 1 和 0 的数组,我不相信整数是 16 位的基于。它们看起来更像 15 位,但我不确定。

提前感谢您的帮助。

【问题讨论】:

那是不是二进制文件。这是一个十六进制文件。 你怎么知道?记事本不能将其解释为十六进制吗? 如果这是一个随机的二进制文件,记事本会显示垃圾。二进制文件恰好看起来像 ascii 十六进制编码的可能性很小,但这不太可能。您的评论提及行也是一个提示。二进制数据中没有行,因为与文本文件不同,换行字节(或 Windows 上的字节)只是更随机的二进制数据。 我对你的解释是 HEX 的问题是我进入了编译可执行文件并生成文件的 c 代码,它被明确定义为“short int”和文件就是这样写的。 文件是怎么写的?如果是 fprintf 的某个版本,使用像 "%04x" 这样的格式字符串,那么你写的是 ascii 文本。 【参考方案1】:

假设您有恰好解码为 ascii hex 的二进制数据,您可以将文件读入 python array。它与您解压成元组的第二个示例没有太大区别,只是它更快并且内存占用更少。根据您接下来要执行的操作,改为读入 numpy 数组是合理的。

import os
import array

#filePathC = "C:\\Working\\Vocoder Sims\\ofile.chan"
filePathC = "test.bin"

count = os.stat(filePathC).st_size / 2
with open(filePathC, 'rb') as fp:
    binaryC3 = array.array("h")
    binaryC3.fromfile(fp, count)

print binaryC3
print bin(binaryC3[0])

对于您的示例文件,这给了我

array('h', [17719, 14129, 13621, 16965, 14647, 14640, 16708, 14403, 17990, 12596, 14129, 17474, 16705, 17712, 13880, 16965, 12612, 14401, 12554, 13123, 13380, 17463, 13892, 12342, 17462, 12600, 17714, 14392, 12854, 13124, 14132, 14386, 17208, 16691, 13618, 17713, 2626, 13873, 14148, 12356, 16690, 14660, 14384, 12357, 14384, 17203, 13361, 17202, 12337, 16695, 14658, 13873, 13635, 16949, 12357])
0b100010100110111

【讨论】:

如何将这个数组转换为可以进行模 2 运算的 1 和 0? 您想要一个长的 0 和 1 流吗?我以为你想要一个 16 位短值数组。让我想想…… 是的。我想添加位错误,然后以相同的格式将文件重新组合在一起。这才是真正的结局。我想获取原始比特流文件和错误。

以上是关于在python中打开由c程序编写为1和0的16位整数的二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

golang数据类型变量定义

用Python 3.1.3 写几个进制转换的程序

Go语言基础之基本数据类型

任意十进制数转换成ASCII码C语言程序

GO的跨平台数扰类型

打开由C ++程序编写的.bin文件[关闭]