如何在Lua中读取由C生成的二进制文件
2013-12-4 13:5:11
收藏:0
阅读:104
评论:2
我想读取另一个程序提供的32位整数二进制文件。该文件仅包含整数,没有其他字符(如空格或逗号)。用于读取此文件的C代码如下:
FILE* pf = fopen("C:/rktemp/filename.dat", "r");
int sz = width*height;
int* vals = new int[sz];
int elread = fread((char*)vals, sizeof(int), sz, pf);
for( int j = 0; j < height; j++ )
{
for( int k = 0; k < width; k++ )
{
int i = j*width+k;
labels[i] = vals[i];
}
}
delete [] vals;
fclose(pf);
但是我不知道如何使用Lua将该文件读入数组。
我尝试使用io.read来读取此文件,但是数组的一部分看起来像这样:
Matlab代码读取此文件如下:
row = image_size(1);
colomn = image_size(2);
fid = fopen(data_path,'r');
A = fread(fid, row * colomn, 'uint32')';
A = A + 1;
B = reshape(A,[colomn, row]);
B = B';
fclose(fid);
我尝试了一个将字节转换为整数的函数,我的代码如下:
function bytes_to_int(b1, b2, b3, b4)
if not b4 then error("need four bytes to convert to int",2) end
local n = b1 + b2*256 + b3*65536 + b4*16777216
n = (n > 2147483647) and (n - 4294967296) or n
return n
end
local sup_filename = '1.dat'
fid = io.open(sup_filename, "r")
st = bytes_to_int(fid:read("*all"):byte(1,4))
print(st)
fid:close()
但它仍无法正确读取此文件。
点赞
用户17139814
现在您可以调用 string.unpack 来使用 Lua 语言的新功能,它具有许多格式转换选项。以下选项可能会很有用:
<设置小端>设置大端=设置本机字节序i[n]有符号整数,大小为 n 个字节(默认为本机大小)I[n]无符号整数,大小为 n 个字节(默认为本机大小)
由于您的 PC 的架构未知,因此我假设要读取的数据为无符号本机字节序。
由于您正在从文件中读取二进制数据,因此应使用 io.open(sup_filename, "rb")。
以下代码可能会很有用:
local fid = io.open(sup_filename, "rb")
local contents = fid:read("a")
local now
while not now or now < #contents do
local n, now = string.unpack("=I4", contents, now)
print(n)
end
fid:close()
另请参阅:Lua 5.4 手册
2023-02-09 11:46:54
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你只调用一次
bytes_to_int。你需要为每个想要读取的int调用它。例如:fid = io.open(sup_filename, "rb") while true do local bytes = fid:read(4) if bytes == nil then break end -- EOF local st = bytes_to_int(bytes:byte(1,4)) print(st) end fid:close()