我必須從一個文件中讀取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];
這是正確的嗎?對我來說似乎不正確。
我必須從一個文件中讀取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];
這是正確的嗎?對我來說似乎不正確。
下面的代碼威力工作:
myInt = *(reinterpret_cast<unsigned int*>(p + 6));
IFF:
sizeof(int) == 4
,這是不保證到處如果不一樣,因爲Dietmar建議,你應該環比數據(正向或反向根據字節順序),並完成類似
myInt = myInt << 8 | static_cast<unsigned char>(p[i])
這是定位安全(這應該是每一個系統上)。仍然注意點1和3.
嚴格的別名。你不能通過unsigned int類型的glvalue來訪問一堆字符的存儲值。 – 2014-10-06 05:38:04
不要這樣做的另一個原因。 – 2014-10-06 05:39:11
嘗試myInt = *(reinterpret_cast<unsigned int*>(p + 6));
。
這需要第6個字符的地址,重新解釋爲指向unsigned int的指針,然後返回它指向的(unsigned int)值。
這對於字節順序可能會很危險 – 2014-10-04 20:13:26
爲什麼要將它指向一個指針? – Davlog 2014-10-04 21:06:25
因爲沒有'unsigned int'變量來查看。我們正在研究需要指針的任意內存。 'reinterpret_cast'只能用於指針。 – 2014-10-05 13:03:38
我同意以前的答案,但只是想補充說明,如果該文件是用不同的字節順序創建的,則此解決方案可能無法100%工作。
我不想混淆你額外的信息,但請記住,當你從文件直接轉換時,字節順序可能會導致你的問題。
這裏有一個關於字節序的教程:http://www.codeproject.com/Articles/4804/Basic-concepts-on-Endianness
嘗試'*(int *)(p + 6)'。 – Athari 2014-10-04 19:25:35
使用'memcpy'。 *(int *)(p + 6)'(1)可能會遇到對齊問題,並且(2)違反嚴格的別名。字節順序也是一個問題。 – 2014-10-04 19:30:17
你需要將不同字節的位移到合適的位置。取決於轉移價值的永恆性。循環中的賦值可能是'myInt = myInt << 8 | static_cast(p [i])'。或者,您可能想要反向循環循環。 –
2014-10-04 19:30:30