我想知道如何解析长二进制数据,例如:"10100011111000111001“位: 0-4是id位,5-15是数据等等.
二进制数据结构可以改变,所以我需要建立一种数据库来存储数据,如何解析每个字符串。
插图(可以是200位):
想法如何实施?谢谢
编辑
我在这里错过了什么?
struct Bitfield {
uint16_t a : 10 , b:6;};
void diag(){
uint16_t t= 61455;
struct Bitfield test = {t};
cout<<"a: "<<test.a<<endl;
cout<<"b: "<<test.b<<endl;
return;}
产出如下:
a: 15
b: 0
发布于 2020-07-12 02:45:14
可供选择
要管理一个大的结构化位集,您有以下选项:
unsigned long long
更多的位。
它非常容易使用;编译器为您管理对位或位组的访问。主要的不便是位布局依赖于实现。因此,这不是编写以二进制格式交换数据的可移植代码的选项。uint8_t
的数组。data()
成员可以直接访问二进制数据。vector<bool>
非常类似,用于访问位。它在编译时具有固定的大小,但它提供了一些有用的特性,例如从字符串或流]5读取和写入ascci中的二进制文件,从整数类型的二进制值进行转换,以及对整个位集进行逻辑操作。做出你的选择
要以可移植的方式与外部世界通信,最简单的方法是使用位集。Bitset使用ascci '0‘或'1’(或其任何替代品)以一种格式提供简单的输入/输出/字符串转换。
bitset<msg_header_size> bh,bh2;
bitset<msg_body_size> bb,bb2;
cin>>bh>>bb; // reads a string od ascii 0 and 1
cout<<bh<<"-"<<bb<<endl<<endl; // writes a string of ascii 0 and 1
您还可以从/转换为二进制数据(但是只有一个元素,足够大到位集大小):
bitset<8> b(static_cast<uint8_t>(c));
cout<<b<<endl;
cout<<b.to_ulong()<<endl;
对于读/写大集,您需要读取小位集,并使用逻辑运算符将它们聚合到更大的位集中。这似乎很费时,它实际上非常接近于在容器中的积分,但不必考虑字节边界。
在您的示例中,具有固定大小的头和最大大小的bitset
似乎是与外部世界交换二进制数据的一个不错的选择(但是要小心,因为变量部分是正确的)。
为了处理数据内容,访问特定位很容易,但您必须使用一些逻辑操作(shift和)来访问比特组。此外,如果您希望代码具有可读性和可维护性,最好抽象位布局。
结论:
因此,我强烈建议在内部使用(一种位字段结构)来处理数据,并与原始数据和同时保持可比较的内存占用,同时使用位集来转换/转换到这个结构,以便进行外部数据交换。
发布于 2020-07-12 02:14:57
“最好的办法”取决于问题的细节。
如果整数符合可用的最大整数类型(通常长为长),则首先将字符串转换为整数(例如,假设C++11可用,使用stoi/stol/stoll函数)。然后使用位移位与二进制和(&)相结合来提取您感兴趣的值的部分。
如果整数不符合可用的最大整数类型,则将其拆分为字符串(使用substr函数),然后逐个将子字符串转换为整数。
https://stackoverflow.com/questions/62859624
复制相似问题