2016-06-14 44 views
-3

我們有一個Unix代碼來創建直徑文件作爲輸入.xml文件。 由於我們已經轉移到Linux平臺,我們需要創建相同的實用程序,代碼編譯成功,但實用程序沒有按預期創建輸出文件內容,爲了每個字節都反轉位,我認爲它是因爲Linux是小端。Linux上的Unix(big endian)代碼和相同的代碼(小端),創建不同的輸出直徑文件

消息塊被寫入到輸出文件是格式:

ACE_Message_Block* mb = m_pReqMsgBlock; 
while (mb) { 
       out.write(mb->rd_ptr(), mb->size()); 
       mb = mb->cont(); 
      } 

任何人都可以提出什麼額外的可以被添加到代碼,以便可以字節預期的方式寫的?

+5

「Linux是小端」 - 不,那是你的機器!如果你的代碼依賴於數據的特定表示,那麼它寫得很糟糕。使用適當的序列化與bitshifts並且從不依賴實現特定的行爲。 – Olaf

+0

試着看看是否扭轉每一個位都會有所幫助。 http://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte。請注意,只有在將文件傳輸到具有不同字節的系統時才能執行此操作。 –

+1

以前的平臺是什麼?並請指明您的實際和預期產出。 –

回答

5

您必須將大端格式轉換爲小端格式。對於結構中的16位和32位值,這必須單獨完成。

htonshtonl這樣的函數可以分別用於轉換16位和32位整數。

一旦數字被轉換,那麼它可以通過write函數寫入。

+0

我已經嘗試過,但是要寫入的數據不是整數,它來自我們正在使用的ACE類的外部庫ACE_Message_Block –

+0

您需要查看ACE_Message_Block的結構元素,並且每次轉換一個元素如上所示。請注意,8位值在大端和小端中是相同的。 –

0

如果您要將二進制數據寫入文件,那麼該二進制數據的「正確」字節序是機器特定的。因此,如果在具有另一個字節序的機器上運行,這些數據是不同的,這是正確的。您可能會在同一臺Linux機器上再次用另一個程序解析這些二進制數據,這也意味着它是小端的。

如果您希望輸出是不依賴端點的(例如,因爲讀取數據的程序在您的big-endian unix機器上),您不應該輸出二進制數據。

相關問題