簡體   English   中英

C ++將結構體轉換為字節數組

[英]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.

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