[问题] 读取C语言储存数值的2进位档案

楼主: smvenjoy (好好坏坏~~)   2018-08-17 11:03:35
最近在试着解C语言写好的二进制档案,
C的程式码大致如下:
//写档
unsigned char a,b;
a = 0x11;
b = 0x22;
FILE *fp = fopen("test.dat","wb");
fwrite(&a, sizeof(unsigned char), 1, fp);
fseek(fp,2,SEEK_SET);
fwrite(&b, sizeof(unsigned char), 1, fp);
fclose(fp);
//解档印出c=0x11 d=0x22
fp = fopen("test.dat","rb");
nsigned char c,d;
fread(&c,sizeof(unsigned char),1,fp);
fseek(fp,2,SEEK_SET);
fread(&d,sizeof(unsigned char),1,fp);
printf("c=0x%x d=0x%x\n",c,d);
fclose(fp);
因现在想使用Python做解档的部分,把正确数值解出来,
虽然上网找了许多方式,但在python仍只解出0x11的数值,
想询问是否有相关的方法或关键字可以提供解惑,
谢谢!
Python try的code:
with open('test.dat', 'rb') as fh:
patch1 = fh.read()
print(patch1)
打印出来的结果为b'\x11\x00"',
是否需再搭配seek?
因尚为初学者,针对用法还不甚熟悉,
还请各位大大指点迷津,谢谢!
作者: gmccntzx1 (o.O)   2018-08-18 04:11:00
原来是要在中间插入0...那其实你一开始说明清楚会更好只是我也觉得你要用这种做法当作设定 delimiter 很怪而且一开始 @djshen 也跟你说了可以印出 \x22 看看囉再补充, 你在上面问道 \x22 为何印出来是 "这点, @s860134 已经回答你了, 建议你去看一下ascii table
楼主: smvenjoy (好好坏坏~~)   2018-08-17 22:45:00
所以我本来就是要来请教python的用法的,谢谢有试了gmccntzx1的语法应该为patch1.hex()才对喔感谢以上先进的帮忙,已经试出对的显示结果,谢谢!
作者: s860134 (s860134)   2018-08-17 22:43:00
那你python根本就是逻辑错误 你自己试试看 fh.seek(1)fh.read(1) 出来是啥
楼主: smvenjoy (好好坏坏~~)   2018-08-17 22:41:00
c就是故意要写移位的阿,中间插入0这样s86大,C没有写错喔,就是要这样应用的
作者: s860134 (s860134)   2018-08-17 22:38:00
1. 你 C 根本写错了 2. python 默认显示 ascii不能解的才会用\x?? 来表示你最好找一下 seek 的用法... 顺便跟你说 python 也有
作者: gmccntzx1 (o.O)   2018-08-17 21:55:00
为何两个 fwrite 之间要插入一个 fseek?你这样会多写入一个 null (0x00)所以用 python 读档后,你得到的结果是 b'\x11\x00"'实际上就是3个字符, '\x11' '\x00' '"'补充一下, patch.encode('hex') 就是你想看到的修正: patch1.encode('hex')
楼主: smvenjoy (好好坏坏~~)   2018-08-17 20:20:00
不太了解s86大的说法,C已经写好也解完了,我是想从python也能读档得到例如变量K=0x11、G=0x22这样请问为什么“"”这个符号就是 \x22?是编码的关系?那为何0x11可以直接一目了然
作者: s860134 (s860134)   2018-08-17 19:31:00
我猜你seek有问题seek 从零开始你c也不熟?
作者: eight0 (欸XD)   2018-08-17 19:28:00
“"”这个符号就是 \x22
楼主: smvenjoy (好好坏坏~~)   2018-08-17 18:03:00
我只是想经由python读档解出像C语言解出一样的两变量0x11、0x22
作者: renshin (阿信)   2018-08-17 17:19:00
print(patch1.decode()) 不是很确定是不是你要的功能
楼主: smvenjoy (好好坏坏~~)   2018-08-17 16:52:00
D大可否明确说明一下,谢谢啊
作者: djshen (djshen)   2018-08-17 16:17:00
你要不要print(b'\x22')
楼主: smvenjoy (好好坏坏~~)   2018-08-17 15:48:00
印出来的结果为b'\x11\x00"',并无原本的0x22的数值
楼主: smvenjoy (好好坏坏~~)   2018-08-17 15:33:00
没有解出0x22的值
作者: djshen (djshen)   2018-08-17 15:40:00
有阿
作者: djshen (djshen)   2018-08-17 12:04:00
你试过哪些方法你的结果不是对的吗
楼主: smvenjoy (好好坏坏~~)   2018-08-18 12:32:00
谢谢g大热心的讲解,原理了解了,再次感谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com