如何從文件讀取64位無符號整數?我已經將它存儲爲實際的二進制數據,而不是字符串表示。使用fscanf()讀取無符號long long
1
A
回答
3
它是如何編碼的?二進制數通常在endianness中有所不同。如果您想假定它與當前主機的字節序相同,則可以直接使用fread
。否則,你需要在閱讀後進行字節交換。
獎勵積分,假設你有過怎樣的序列化控制,你說明一些標誌或字節順序標記的字節序。
3
事情是這樣的:
FILE * fp = fopen("file.bin", "rb");
uint64_t value;
if (fread(&value, sizeof value, fp) != sizeof value) { /* error */ }
// ...
fclose(fp);
如果是你是誰寫的數據,這應該工作的開箱。如果數據來自其他地方,請檢查二進制格式的文檔以說明序列化格式與平臺之間的表示差異(例如可能需要進行字節交換)。
一種替代,教學法更多有用的,但效率不高的方法是把數據讀入緩衝區並應用自己的處理。這是更靈活(例如,你可以對付瘋狂的字節排列順序一樣3-2-1-4-7-8-6-5),但大概慢了許多:
unsigned char buf[sizeof uint64_t];
if (fread(buf, sizeof buf, fp) != sizeof buf) { /* error */ }
uint64_t leval = buf[0] + (buf[1] << 8) + /* ... */;
uint64_t beval = buf[7] + (buf[6] << 8) + /* ... */;
uint64_t ceval = (buf[0] << 16) + (buf[1] << 8) + buf[2] + (buf[3] << 24) + /* ... */;
相關問題
- 1. 劃分無符號long long
- 2. 無符號long long溢出
- 3. Java讀取二進制文件(無符號long long)
- 4. 從二進制文件中讀取無符號long long
- 5. 使用無符號long long的符號擴展
- 6. unsigned int(32bit)爲無符號long long(64bit)
- 7. MSVC++處理無符號long long int
- 8. 問題在無符號long long在C++
- 9. 將int轉換爲無符號long long
- 10. (lldb)打印無符號long long in hex
- 11. 類型轉換爲無符號long long?
- 12. 無符號long long型按位移
- 13. ç傳遞無符號long long值
- 14. 使用無符號long long而不是float來防止打包
- 15. 使用核心數據存儲無符號long long
- 16. 使用cx_Oracle讀取LONG RAW
- 17. 用簽名long long結果減去無符號長整數?
- 18. 檢查是否有無符號long long可用
- 19. 替代(無符號long long)強制轉換無警告
- 20. 將字符串轉換爲無符號long long int C
- 21. 無符號long的snprintf附加逗號
- 22. 問題與無符號long long和打印C++
- 23. 什麼應該是無符號long long的確切大小
- 24. NSDecimalNumber和大的無符號long long(64位)整數
- 25. 無符號long long的二進制表示
- 26. 按位運算無符號long long在c中
- 27. 數據類型轉換(無符號long long到char)
- 28. 如何初始化一個無符號的long long類型?
- 29. 核心數據無符號long long best practices
- 30. 從數組中簡單的無符號long long轉換
,那麼你最好使用FREAD然後,而不是fscanf ..因爲這是從字符串中讀取的。 http://www.cplusplus.com/reference/clibrary/cstdio/fread/ – billjamesdev