[英]pack/unpack functions for C++
注意:我知道這之前已經被問過很多次了,但沒有一個問題有一個具體的、可移植的、維護的庫的鏈接。
我需要一個 C 或 C++ 庫來實現 Python/Ruby/Perl 之類的pack
/ unpack
功能。 有這樣的圖書館嗎?
編輯:因為我發送的數據很簡單,所以我決定只使用memcpy
、指針和hton*
函數。 我是否需要以任何方式操縱一個char
,以與平台無關的方式通過網絡發送它? ( char
僅用作字節,而不用作字符)。
在 C/C++ 中,通常您只需按照正確的順序編寫一個包含各種成員的struct
(正確的打包可能需要編譯器特定的編譯指示),然后使用原始fwrite
/ fread
(或read
/ write
時)將其轉儲/讀取到文件/從文件read
處理 C++ 流)。 實際上, pack
和unpack
是為了讀取用這種方法生成的東西而生的。
如果您需要將結果保存在緩沖區而不是文件中,那就更容易了,只需使用memcpy
將結構復制到您的緩沖區即可。
如果表示必須是可移植的,您主要關注的是字節順序和字段打包; 第一個問題可以通過各種hton*
函數來解決,而第二個問題可以通過特定於編譯器的指令來解決。
特別是,很多編譯器支持#pragma pack
指令(見這里的VC ++, 這里的海灣合作委員會),它允許你管理(不需要)填充,編譯器可以在插入struct
有其田上方便邊界對齊。
但是請記住,在某些體系結構上,如果特定類型的字段未在其自然邊界上對齊,則不允許訪問它們,因此在這些情況下,您可能需要執行一些手動memcpy
將原始字節復制到變量正確對齊。
是:使用std::copy
from <algorithm>
對變量的字節表示進行操作。 每個變量T x;
可以通過char * p = reinterpret_cast<char*>(&x)
以字節數組的形式訪問; 並且p
可以被視為指向數組char[sizeof(T)]
的第一個元素的指針。 例如:
char buf[100];
double q = get_value();
char const * const p = reinterpret_cast<char const *>(&q);
std::copy(p, p + sizeof(double), buf);
// more stuff like that
some_stream.write(buf) //... etc.
然后回去:
double r;
std::copy(data, data + sizeof(double), reinterpret_cast<char *>(&r));
簡而言之,您不需要在 C++ 中進行專用的pack
/ unpack
,因為該語言已經允許您訪問其變量的二進制表示作為語言的標准部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.