簡體   English   中英

為什么浮點字節交換與整數字節交換不同?

[英]Why is floating point byte swapping different from integer byte swapping?

我有一個雙打的二進制文件,我需要使用C ++加載。 但是,我的問題是它是用big-endian格式編寫的,但是fstream >> operator會因為我的機器是little-endian而讀錯了。 解決整數似乎是一個簡單的問題,但對於雙精度和浮點數,我找到的解決方案將無效。 我怎么能(或應該)解決這個問題?

我把它讀作整數字節交換的參考:
如何在C ++中的big-endian和little-endian值之間進行轉換?

編輯:雖然這些答案很有啟發性,但我發現我的問題在於文件本身而不是二進制數據的格式。 我相信我的字節交換確實有效,我只是得到了令人困惑的結果。 謝謝你的幫助!

最便攜的方法是以文本格式序列化,以便您沒有字節順序問題。 這就是operator>>工作方式,所以你不應該有>>任何字節序問題。 二進制格式(可以解釋字節序問題)的主要問題是浮點數由多個尾數位,多個指數位和一個符號位組成。 指數可以使用偏移量。 這意味着直接字節重新排序可能不夠,具體取決於源和目標格式。

如果您在兩台計算機上使用IEEE-754,那么您可以使用直接字節反轉,因為此標准指定了應該是可移植的位串交換格式(除了字節順序問題)。

如果你必須在兩個機器架構之間進行轉換而你必須使用原始字節內存轉儲,那么只要基本數字格式相同(即它們在數字的每個部分中具有相同的位數),你就可以閱讀將數據轉換為unsigned char數組,使用一些基本的字節和位交換例程來糾正存儲格式,然后將原始字節復制到相應類型的變量中。

標准轉換運算符不適用於二進制數據,因此不清楚你是如何得到的。

但是,由於字節交換是對字節而不是數字進行操作,因此您可以對要作為整數的數據進行浮點運算。

由於文本效率太低而且浮點數據集往往太大,所以想要這樣做是完全合理的。

int32_t raw_bytes;
stream >> raw_bytes; // not an int, just 32 bits of bytes
my_byte_swap( raw_bytes ); // swap 'em
float f = * reinterpret_cast< float * >( & raw_bytes ); // read them into FPU

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM