iT邦幫忙

0

有關檔案讀取問題

這裡有一個程式碼

typedef struct{
	int LENGTH;
}So;
int main(){
So SOURCE;
//fpr指針指向檔案
fread((char*)&SOURCE.x, 2,1, fpr);//讀兩個byte為一組,讀一次
printf("%x",SOURCE.x);
}

假如原檔案是0034
但當我printf出來時卻是3400
請問這跟指標指向的位置有關嗎?
為甚麼兩個BYTE會交換位置呢

怎麼 struct 沒有 x 欄位?
淺水員 iT邦大師 6 級 ‧ 2018-12-07 00:07:39 檢舉
主要是 endian 的問題,機器有分 big endian 跟 little endian
https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
wwx iT邦好手 1 級 ‧ 2018-12-07 11:36:28 檢舉
而且如果他的 int 是4bytes長, struct又沒清成0,
然後只讀2bytes, 哪天顯示超過4digis他又要上來問了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2018-12-07 09:34:09
最佳解答

我怕講的太過技術性你可能沒辦法很了解。所以我用比較白話一點的說法好了。

我推測你這是一個機器語言的檔案。配合一下「淺水員」跟你說的東西。
其實這可以用一個說法來解釋。就是一般我們由左至右是從大位數書寫。
但機器語言是從小位數中一個byt由左至右的書寫過去。

這也是為何一般程式語言裏,有時需要定義區塊大小的因素。

如數值10來計算。一般int來說,其是定義在65535。也就是兩個byt的計算
在其10進位的10數值。其會轉換成 0A。因需要2個BYT的情況。所以會補0變成 00 0A

但用機器語言的情況寫入時,其寫入會從低位數讀取再寫入。

也就是說。00 0A的值。它會先從 0A 先寫入。然後再來是 00
這樣子的情況下。你在其檔案的內容。就會是 0A 00的值。

其實如果你以前有在玩遊戲用過金手指的話。因該都會發現要計算或修改。都是需要用倒序的方式來判斷讀取。

我要發表回答

立即登入回答