[英]c++ memcpy a struct into a byte array
將結構數據復制到我的byteArray
。 該字節數組用於通過接口傳遞信息。 對於普通的數據類型,我必須使用byteswap
。
但是現在我有了一個結構。 當我使用memcpy
,該結構的值被交換。
如何將結構輕松且“正確”地復制到字節數組?
memcpy(byteArray, &stData, sizeof(stData));
stData
具有簡單的整數。 0x0001
將作為0x1000
存儲在字節數組中。
如果您使用的是x86架構計算機,則整數將以“小尾數”順序存儲,最低有效字節在前。 這就是為什么0x0001在字節數組中顯示為0x01 0x00的原因。 只要您在具有相同體系結構的計算機上解壓縮,就可以正常工作,但這是二進制序列化非常重要的(許多)原因之一。
如果您需要以安全的方式在機器之間交換二進制數據,則可以決定一個標准(例如,將所有二進制數據轉換為little-endian或big-endian;網絡有線協議通常會轉換為big-endian,盡管很多性能專有的系統堅持使用低字節序,因為今天這是大多數計算機上的本機格式),或者正在尋找可移植的二進制文件格式,例如HDF或BSON。 (這些存儲有關要存儲的二進制數據的元數據。)最后,您可以轉換為ASCII(XML,json)。 (還要注意,“大”和“小”並不是唯一的選擇-“每台機器”都是一個很高的要求,因為它們還沒有被全部發明出來。:))
有關許多示例,請參見Wikipedia或在SO上搜索“ endian”。
您的問題是您位於Little Endian端,您希望將其存儲為Big Endian。
在標准C庫中,您具有執行此功能的功能,即htonl:將主機(您的小端機)轉換為網絡標准(大端機)。
s表示16位,l表示32位( http://linux.die.net/man/3/htons )
對於4個字節的整數,您可以執行
#include <arpa/inet.h>
#include <stdint.h>
...
*(uint32_t*)byteArray = htonl((uint32_t)stData);
對於8個字節的int,您可以使用bswap_64 https://www.gnu.org/software/gnulib/manual/html_node/bswap_005f64.html
但是它僅存在於gnu libc上。 否則,您必須手動進行交換,網絡上有很多示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.