2014-10-04 21 views
1

我必須從一個文件中讀取10個字節,最後4個字節是一個無符號整數。但是我得到了一個11個字節長的字符數組/指針。如何將最後4個字節(末尾沒有零終止字符)轉換爲無符號整數?4個字符爲int在c + +

//pesudo code 
char *p = readBytesFromFile(); 
unsigned int myInt = 0; 
for(int i = 6; i < 10; i++) 
    myInt += (int)p[i]; 

這是正確的嗎?對我來說似乎不正確。

+1

嘗試'*(int *)(p + 6)'。 – Athari 2014-10-04 19:25:35

+1

使用'memcpy'。 *(int *)(p + 6)'(1)可能會遇到對齊問題,並且(2)違反嚴格的別名。字節順序也是一個問題。 – 2014-10-04 19:30:17

+3

你需要將不同字節的位移到合適的位置。取決於轉移價值的永恆性。循環中的賦值可能是'myInt = myInt << 8 | static_cast (p [i])'。或者,您可能想要反向循環循環。 – 2014-10-04 19:30:30

回答

2

下面的代碼威力工作:

myInt = *(reinterpret_cast<unsigned int*>(p + 6)); 

IFF:

  • 沒有對齊的問題(例如,在GPU的內存空間如果沒有提供某些擔保,這很可能會打擊)。
  • 可以保證系統字節序是用於存儲數據
  • 你可以肯定的是sizeof(int) == 4,這是保證到處

如果不一樣,因爲Dietmar建議,你應該環比數據(正向或反向根據字節順序),並完成類似

myInt = myInt << 8 | static_cast<unsigned char>(p[i]) 

這是定位安全(這應該是每一個系統上)。仍然注意點1和3.

+0

嚴格的別名。你不能通過unsigned int類型的glvalue來訪問一堆字符的存儲值。 – 2014-10-06 05:38:04

+0

不要這樣做的另一個原因。 – 2014-10-06 05:39:11

1

嘗試myInt = *(reinterpret_cast<unsigned int*>(p + 6));

這需要第6個字符的地址,重新解釋爲指向unsigned int的指針,然後返回它指向的(unsigned int)值。

+0

這對於字節順序可能會很危險 – 2014-10-04 20:13:26

+0

爲什麼要將它指向一個指針? – Davlog 2014-10-04 21:06:25

+0

因爲沒有'unsigned int'變量來查看。我們正在研究需要指針的任意內存。 'reinterpret_cast'只能用於指針。 – 2014-10-05 13:03:38

2

我同意以前的答案,但只是想補充說明,如果該文件是用不同的字節順序創建的,則此解決方案可能無法100%工作。

我不想混淆你額外的信息,但請記住,當你從文件直接轉換時,字節順序可能會導致你的問題。

這裏有一個關於字節序的教程:http://www.codeproject.com/Articles/4804/Basic-concepts-on-Endianness