[問題] 讀取C語言儲存數值的2進位檔案

看板Python作者 (好好壞壞~~)時間5年前 (2018/08/17 11:03), 5年前編輯推噓2(2044)
留言46則, 6人參與, 5年前最新討論串1/1
最近在試著解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? 因尚為初學者,針對用法還不甚熟悉, 還請各位大大指點迷津,謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.32.103.165 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1534475017.A.4BA.html

08/17 12:04, 5年前 , 1F
你試過哪些方法
08/17 12:04, 1F
※ 編輯: smvenjoy (114.32.103.165), 08/17/2018 15:20:42

08/17 15:21, 5年前 , 2F
你的結果不是對的嗎
08/17 15:21, 2F

08/17 15:33, 5年前 , 3F
沒有解出0x22的值
08/17 15:33, 3F

08/17 15:40, 5年前 , 4F
有阿
08/17 15:40, 4F

08/17 15:48, 5年前 , 5F
印出來的結果為b'\x11\x00"',並無原本的0x22的數值
08/17 15:48, 5F

08/17 16:17, 5年前 , 6F
你要不要print(b'\x22')
08/17 16:17, 6F

08/17 16:52, 5年前 , 7F
D大可否明確說明一下,謝謝啊
08/17 16:52, 7F

08/17 17:19, 5年前 , 8F
print(patch1.decode()) 不是很確定是不是你要的功能
08/17 17:19, 8F

08/17 18:03, 5年前 , 9F
我只是想經由python讀檔解出像C語言解出一樣的兩變數0x1
08/17 18:03, 9F

08/17 18:03, 5年前 , 10F
1、0x22
08/17 18:03, 10F

08/17 19:28, 5年前 , 11F
「"」這個符號就是 \x22
08/17 19:28, 11F

08/17 19:31, 5年前 , 12F
我猜你seek有問題
08/17 19:31, 12F

08/17 19:32, 5年前 , 13F
seek 從零開始
08/17 19:32, 13F

08/17 19:33, 5年前 , 14F
你c也不熟?
08/17 19:33, 14F

08/17 20:20, 5年前 , 15F
不太瞭解s86大的說法,C已經寫好也解完了,我是想從pyth
08/17 20:20, 15F

08/17 20:20, 5年前 , 16F
on也能讀檔得到例如變數K=0x11、G=0x22這樣
08/17 20:20, 16F

08/17 20:31, 5年前 , 17F
請問為什麼「"」這個符號就是 \x22?是編碼的關係?那為何
08/17 20:31, 17F

08/17 20:32, 5年前 , 18F
0x11可以直接一目了然
08/17 20:32, 18F

08/17 21:55, 5年前 , 19F
為何兩個 fwrite 之間要插入一個 fseek?
08/17 21:55, 19F

08/17 21:55, 5年前 , 20F
你這樣會多寫入一個 null (0x00)
08/17 21:55, 20F

08/17 21:56, 5年前 , 21F
所以用 python 讀檔後,你得到的結果是 b'\x11\x00"'
08/17 21:56, 21F

08/17 21:57, 5年前 , 22F
實際上就是3個字元, '\x11' '\x00' '"'
08/17 21:57, 22F

08/17 22:11, 5年前 , 23F
補充一下, patch.encode('hex') 就是你想看到的
08/17 22:11, 23F

08/17 22:12, 5年前 , 24F
修正: patch1.encode('hex')
08/17 22:12, 24F

08/17 22:38, 5年前 , 25F
1. 你 C 根本寫錯了 2. python 預設顯示 ascii不能解的才
08/17 22:38, 25F

08/17 22:38, 5年前 , 26F
會用\x?? 來表示
08/17 22:38, 26F

08/17 22:39, 5年前 , 27F
你最好找一下 seek 的用法... 順便跟你說 python 也有
08/17 22:39, 27F

08/17 22:41, 5年前 , 28F
c就是故意要寫移位的阿,中間插入0這樣
08/17 22:41, 28F

08/17 22:42, 5年前 , 29F
s86大,C沒有寫錯喔,就是要這樣應用的
08/17 22:42, 29F

08/17 22:43, 5年前 , 30F
那你python根本就是邏輯錯誤 你自己試試看 fh.seek(1)
08/17 22:43, 30F

08/17 22:43, 5年前 , 31F
fh.read(1) 出來是啥
08/17 22:43, 31F

08/17 22:45, 5年前 , 32F
所以我本來就是要來請教python的用法的,謝謝
08/17 22:45, 32F

08/17 23:11, 5年前 , 33F
有試了gmccntzx1的語法應該為patch1.hex()才對喔
08/17 23:11, 33F

08/17 23:21, 5年前 , 34F
感謝以上先進的幫忙,已經試出對的顯示結果,謝謝!
08/17 23:21, 34F

08/18 04:11, 5年前 , 35F
原來是要在中間插入0...
08/18 04:11, 35F

08/18 04:12, 5年前 , 36F
那其實你一開始說明清楚會更好
08/18 04:12, 36F

08/18 04:16, 5年前 , 37F
只是我也覺得你要用這種做法當作設定 delimiter 很怪
08/18 04:16, 37F

08/18 04:18, 5年前 , 38F
而且一開始 @djshen 也跟你說了可以印出 \x22 看看囉
08/18 04:18, 38F

08/18 04:28, 5年前 , 39F
再補充, 你在上面問道 \x22 為何印出來是 "
08/18 04:28, 39F

08/18 04:29, 5年前 , 40F
這點, @s860134 已經回答你了, 建議你去看一下
08/18 04:29, 40F

08/18 04:29, 5年前 , 41F
ascii table
08/18 04:29, 41F
※ 編輯: smvenjoy (1.163.90.113), 08/18/2018 12:29:31

08/18 12:27, 5年前 , 42F
所以說囉, 一開始把你的想法表達清楚, 可以減少大家
08/18 12:27, 42F

08/18 12:28, 5年前 , 43F
不必要的猜測. 而關於 fseek 的討論, 我想就是因為一開
08/18 12:28, 43F

08/18 12:28, 5年前 , 44F
使我們不了解為何你要這麼做. 在後來你補充說了是為了
08/18 12:28, 44F

08/18 12:29, 5年前 , 45F
當作插入 delimiter 而用時, 大家才了解.
08/18 12:29, 45F

08/18 12:32, 5年前 , 46F
謝謝g大熱心的講解,原理了解了,再次感謝!
08/18 12:32, 46F
文章代碼(AID): #1RTZi9Iw (Python)