2015-05-31 45 views
2

我有一個結構的複製數據的問題我byteArray。該字節數組用於通過接口傳遞信息。對於正常的數據類型,我必須使用byteswapC++的memcpy一個結構成字節數組

但現在我有一個結構。當我使用memcpy時,結構的值被交換。

我怎麼能輕易和「正確地」複製結構的字節數組?

memcpy(byteArray, &stData, sizeof(stData)); 

stData有簡單的整數。 0x0001將作爲0x1000存儲在字節數組中。

+0

因此,你在一個16位「int」的系統? –

回答

2

如果您是x86架構的機器上,那麼整數存儲在與第一最小顯著字節「的Little Endian」順序。這就是爲什麼0x0001會在字節數組中出現0x01 0x00的原因。只要您還在具有相同體系結構的計算機上進行解包,此操作就可以正常工作,但這是二進制序列化不重要的(許多)原​​因之一。

如果您需要以安全的方式在機器之間交換二進制數據,那麼您可以決定一個標準(例如,將所有二進制數據轉換爲小端或大端;網絡線協議通常轉換爲大端儘管許多高性能專有系統自今天起就以小端爲基礎,這是大多數機器上的本機格式),或尋找便攜式二進制文件格式,如HDF或BSON。 (這些存儲關於要存儲的二進制數據的元數據。)最後,您可以轉換爲ASCII(XML,json)。 (另外請注意,「大」和「小」不是唯一的選擇 - 「每臺機器」是一個很高的訂單,因爲它們還沒有被髮明出來:) :)

請參閱wikipedia或搜索「 endian「就是很多例子。

+0

嗯,我怎麼能工作,我會在每臺機器上運行? 我不明白爲什麼你說0x0001會出現0x01 0x00。在我的記憶有01 00 00 00 代碼: INT一個= 0×0001; char c [4]; memcpy(c,&one,4); – lalelu

1

你的問題是,你是小端到底要存儲它作爲大端。

在標準的C庫中,你有這樣做的功能: htons,htonl:host(你的小端機)到網絡標準(big endian)。

S代表16個比特和​​升爲32位(http://linux.die.net/man/3/htons

對於4個字節整數可以做

#include <arpa/inet.h> 
#include <stdint.h> 
... 
*(uint32_t*)byteArray = htonl((uint32_t)stData); 

爲8個字節詮釋可以使用bswap_64 https://www.gnu.org/software/gnulib/manual/html_node/bswap_005f64.html

但是,只有它存在於GNU libc上。否則,你必須手動交換,網上有很多例子。

+0

*標準* C庫中的函數是htons,htonl嗎?我無法在[這裏]找到它們(http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=htonl)或Harbison&Steele參考書。標準中提到了哪些地方? –

+0

他們[在POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/functions/htonl.html),而不是標準C –