You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LuaJIT ffi.string字符串编码错误求助:Python2.7写入HDF5后读取乱码

问题分析与解决方案

首先,你的问题出在Python端字符串编码的存储类型错误,以及缺少字符串终止符这两个关键点上,导致LuaJIT读取时解析出乱码和多余数据。

问题根源

  1. 错误的数组类型:你用np.zeros(len(image_name))创建的是默认的float64数组,把ASCII码整数(比如ord('f')=102)存在浮点型数组里时,会被转换成浮点数的二进制格式存储,这和字符的字节表示完全不同,Lua读取时把这些浮点字节当成ASCII字符,自然出现乱码。
  2. 缺少空终止符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_nameunicode类型,需要先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

火山引擎 最新活动