LuaJIT ffi.string字符串编码错误求助:Python2.7写入HDF5后读取乱码
问题分析与解决方案
首先,你的问题出在Python端字符串编码的存储类型错误,以及缺少字符串终止符这两个关键点上,导致LuaJIT读取时解析出乱码和多余数据。
问题根源
- 错误的数组类型:你用
np.zeros(len(image_name))创建的是默认的float64数组,把ASCII码整数(比如ord('f')=102)存在浮点型数组里时,会被转换成浮点数的二进制格式存储,这和字符的字节表示完全不同,Lua读取时把这些浮点字节当成ASCII字符,自然出现乱码。 - 缺少空终止符:
ffi.string需要读取到\0(空字节)才会停止解析字符串,你的编码没有添加这个终止符,导致它会继续读取后续内存中的垃圾数据,出现末尾的乱码后缀。
修复后的代码
Python 2.7 端(正确编码字符串)
我们需要把字符串转换成无符号8位整数数组(uint8),并添加空终止符:
import numpy as np import h5py # 假设你的原始字符串是image_name image_name = "fb15268637bc28e2175502f1a3bec6fb.jpg" # 将字符串转为uint8数组,并在末尾添加空终止符\0 imgname = np.fromstring(image_name + '\0', dtype=np.uint8) # 写入HDF5文件 with h5py.File('your_file.h5', 'w') as f: f.create_dataset('imgname', data=imgname)
注:Python2.7中
str本身就是字节串,直接用fromstring即可;如果你的image_name是unicode类型,需要先encode('ascii')或encode('utf-8')转成字节串。
LuaJIT 端(正确读取)
读取HDF5中的uint8数组,直接用ffi.string解析即可:
local hdf5 = require 'hdf5' -- 假设使用torch-hdf5库 local file = hdf5.open('your_file.h5', 'r') local img_name_data = file:read('imgname'):all() local image_name = ffi.string(img_name_data:data()) file:close() print(image_name) -- 现在应该能正确输出文件名了
额外说明
如果你的字符串包含非ASCII字符(比如中文),需要统一编码格式:Python端用utf-8编码,LuaJIT读取后也用utf-8解析即可,只需要把Python代码中的image_name + '\0'改成image_name.encode('utf-8') + '\0'。
内容的提问来源于stack exchange,提问作者LilHope




