aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 14977|回复: 8

二进制方式读取文件最后两个字节与16进制编辑器看到的不一致,求指教

[复制链接]

5

主题

8

回帖

122

积分

一级会员

积分
122
发表于 2018-1-25 23:48:53 | 显示全部楼层 |阅读模式
本帖最后由 阿福 于 2018-1-25 23:50 编辑

有一文件,使用16进制编辑器查看到最后两个字节是“2380”,我的目的是使用aardio读取这个文件的最后两个字节,使之读取的结果用字符串表示是“2380”(即与16进制编译器查看到的一致),以下是我的代码,控制台看到的结果是空的,求教一下要怎么才能正确读取呢?
import console;
file = io.file(
"D:\下载\48.mp4","rb");
file.seek(
"set");
var byte = file.readback(1);
file.close()
console.log(byte);
console.pause();




166

主题

2153

回帖

1万

积分

管理员

积分
13051
发表于 2018-1-26 00:00:32 | 显示全部楼层
你的文件指针,是在文件开始处,你再倒读一个字节,当然是什么都没有。
要先移到到文件尾,再向后读。

3

主题

42

回帖

310

积分

二级会员

积分
310
发表于 2018-1-26 08:41:47 | 显示全部楼层
而且你不是要读2个字节么,现在才一个,代码错了改一下吧

5

主题

8

回帖

122

积分

一级会员

积分
122
 楼主| 发表于 2018-1-26 11:43:06 | 显示全部楼层
不好意思,之前有点粗心写错了,改了一下,但结果仍然不是我想要的。如下图:
  1. import console;
  2. file = io.file("D:\下载\test.bin","rb");
  3. file.seek("end");
  4. var str = file.readback(2);
  5. file.close()
  6. console.log(str);
  7. console.pause();
复制代码


9

主题

37

回帖

293

积分

二级会员

积分
293
发表于 2018-1-26 14:11:10 | 显示全部楼层
二进制不是ascii码,不能直接显示的

显示那句改成这样:console.log(string.hex(str));

评分

参与人数 1 +1 收起 理由
mzky + 1 学习了

查看全部评分

10

主题

73

回帖

530

积分

三级会员

积分
530
发表于 2018-1-26 14:58:12 | 显示全部楼层
阿福 发表于 2018-1-26 11:43
不好意思,之前有点粗心写错了,改了一下,但结果仍然不是我想要的。如下图:

这块我不太懂 跟着你一起学习
参考:http://bbs.aardio.com/forum.php? ... hlight=%BD%F8%D6%C6

  1. import console;
  2. file = io.file("D:\1.bin","rb");
  3. file.seek("end");
  4. var str = file.readback(2);
  5. file.close()

  6. for(i=1;#str;1){
  7.    console.log(string.format("%X",str[ i ]));
  8. }

  9. console.pause();
复制代码


微信截图_20180126145746.png

10

主题

73

回帖

530

积分

三级会员

积分
530
发表于 2018-1-26 15:03:43 | 显示全部楼层
本帖最后由 mzky 于 2018-1-26 15:06 编辑


个位的结果补了一位
  1. import console;
  2. file = io.file("D:\1.bin","rb");
  3. file.seek("end");
  4. var str = file.readback(10);
  5. file.close()

  6. for(i=1;#str;1){
  7.    var typex=string.format("%X",str[ i ])
  8.    if(string.len(typex)==1){
  9.                    typex="0"+typex
  10.    }
  11.    console.log(typex);
  12. }

  13. console.pause();
复制代码

5

主题

8

回帖

122

积分

一级会员

积分
122
 楼主| 发表于 2018-1-26 16:56:35 | 显示全部楼层
非常感谢各位的热情解答。只是还有一点不太理解,可能是基础不扎实吧,就是type(str)是string,在 for in 中迭代后 type(str[ i ]) 为何变成number了呢?

12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2018-1-26 17:54:14 | 显示全部楼层
本帖最后由 xauto 于 2018-1-26 17:59 编辑
阿福 发表于 2018-1-26 16:56
非常感谢各位的热情解答。只是还有一点不太理解,可能是基础不扎实吧,就是type(str)是string,在 for in  ...
import console;
var str = "abcd";
console.log(
type(str), str[1], 'a'# )
console.pause(
true);

str[1] 取出第一个字节的ASCII编码 所以是 number类型
参考:字符串与编码


您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-7-27 14:47 , Processed in 0.064476 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表