言語:C ++
私はビットパッキングに取り組んでいます(与えられたデータから必要なビットを抽出し、char *にパックします)。私のコードは現在以下をサポートしています:-整数-文字-文字列
構造体の必要なビットを格納する必要がある場合、どのように処理すればよいですか?一般化されたコードwrt構造の入力パラメーターとして何を期待すべきですか?
質問は曖昧かもしれません、そして私は直接の答えを期待していません、ヒントとポインタさえありがたいです。
言語:C ++
私はビットパッキングに取り組んでいます(与えられたデータから必要なビットを抽出し、char *にパックします)。私のコードは現在以下をサポートしています:-整数-文字-文字列
構造体の必要なビットを格納する必要がある場合、どのように処理すればよいですか?一般化されたコードwrt構造の入力パラメーターとして何を期待すべきですか?
質問は曖昧かもしれません、そして私は直接の答えを期待していません、ヒントとポインタさえありがたいです。
非常にパックされた形式についてはこれを参照するか、json、xml、ブーストシリアル化などの標準のマーシャリング形式を使用して、白髪を保存してください。
piotrがすでに提案しているように、既存のライブラリを使用してマーシャルしてみてください。
ただし、すでに自分で行っているので
、サポートされているプリミティブがバイトとして表現できる場合は、ビットパッキングを行うべきではありません(用語について混乱が生じる可能性があります)。そうでない場合は、std::bitsetの使用を検討してください。C ++はリフレクション
を
サポートしていないため、C ++では、一般的で安全かつ移植可能な方法で構造体をバイトパックすることはできません。したがって、構造体ごとに関数を記述して、各プリミティブおよび各メンバー構造体をパックする準備をしてください。
オーバーロードは、これらの関数を一般的な方法で呼び出すのに役立ちます。そのため、コンテナーのパッキング(vector ...)を一般的に行うことができます。ただし、これが必要な場合は、パッキングプリミティブとパッキング構造の違いを避けるために、メンバー関数よりもフリー関数を優先してください。
例:
void Pack(const MyStruct& str, Packer& pack)
{
Pack(str.int1, pack);
Pack(str.string1, pack);
Pack(str.otherStruct, pack);
}
reinterpret_cast<char*>()
構造体にアクセスするために、あたかもそれがchar*
:であるかのように使用できます。
#include <iostream>
using namespace std;
struct myStruct
{
char a; int b;
};
int main(int argc, char* argv[])
{
myStruct instance = { 10, 100 };
//Treat the myStruct instance as though it were a char*
char* pchar = reinterpret_cast<char*>(&instance);
//Output the values of the bytes to the console
for(int i = 0; i < sizeof(instance); i++)
cout << (int)pchar[i] << endl;
getchar();
return 0;
}
ただし、配置のため、すべての文字に意味のあるデータが含まれるわけではないことに注意してください。これは、少なくともVisual Studioではパックプラグマを使用して修正できますが、結果はアーキテクチャ/コンパイラに大きく依存します。
したがって、移植可能/保守可能な方法でバイトをパックしたい場合(つまり、これを実際に使用する場合)、piotrで説明されているシリアル化方法の1つを使用することを強くお勧めします。