如何读取文本文件十进制数转16位整数存为二进制文件?附代码求助
解决方法:将文本中的十进制整数转换为16位整数二进制文件
你的思路方向是对的,但当前代码存在几个关键问题,导致无法生成符合要求的二进制文件。我们一步步来修正和优化:
你的代码中的核心问题
- 错误的文件读取模式:用
rb模式读取文本文件会把内容当作二进制流处理,应该用r模式读取纯文本内容。 - 错误的写入内容:你现在把二进制字符串(比如
0000000001111000)写入二进制文件,这实际上存储的是这些字符的ASCII码(每个字符占1字节),而不是真正的16位二进制数值(每个数值应该占2字节)。 - 手动计算补码易出错:Python自带的
struct模块可以直接处理有符号整数的二进制打包,无需手动计算补码,既高效又准确。 - 未处理多数值行:你的输入文件是一行多个空格分隔的数值,直接按行转
int会报错,因为int("120 300")无法解析为单个整数。
正确的实现步骤
- 读取文本文件中的所有十进制数值,分割并转换为整数列表。
- 验证每个整数是否在16位有符号整数的范围内(
-32768到32767),避免溢出问题。 - 使用
struct模块将每个整数打包为2字节的二进制数据(可按需指定小端/大端字节序)。 - 将打包后的二进制数据写入目标文件。
修正后的代码
import struct def decimal_to_int16_binary(input_filename, output_filename): # 读取文本文件,解析所有数值 with open(input_filename, 'r', encoding='utf-8') as f_read: # 读取全部内容,按空格分割后转成整数列表 values = [int(num.strip()) for num in f_read.read().split() if num.strip()] # 写入二进制文件 with open(output_filename, 'wb') as f_write: for value in values: # 校验数值是否在16位有符号整数范围内 if not (-32768 <= value <= 32767): raise ValueError(f"数值 {value} 超出16位有符号整数范围,请检查输入") # 打包为16位有符号整数:'<h'表示小端字节序,'>h'表示大端字节序 binary_data = struct.pack('<h', value) f_write.write(binary_data) # 调用示例 decimal_to_int16_binary("input_file.txt", "output_file.bin")
代码细节解释
struct.pack('<h', value):h代表有符号16位整数(对应C语言的short类型),<表示小端字节序(低位字节在前),如果需要大端字节序可以替换为>。- 上下文管理器
with:自动处理文件的打开和关闭,避免忘记关闭文件导致的资源泄漏。 - 数值范围校验:提前过滤超出范围的数值,防止打包时出现意外的溢出错误。
对应你的示例输入验证
对于输入120 300 -250 13 -120,转换后的二进制文件会包含5组2字节数据(小端字节序):
- 120 →
0x78 0x00 - 300 →
0x2C 0x01 - -250 →
0x06 0xFF(补码形式) - 13 →
0x0D 0x00 - -120 →
0x88 0xFF
内容的提问来源于stack exchange,提问作者Pbch
相关产品推荐
相关产品推荐

