首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用C++解析长串二进制数据

用C++解析长串二进制数据
EN

Stack Overflow用户
提问于 2020-07-12 01:59:04
回答 2查看 556关注 0票数 1

我想知道如何解析长二进制数据,例如:"10100011111000111001“位: 0-4是id位,5-15是数据等等.

二进制数据结构可以改变,所以我需要建立一种数据库来存储数据,如何解析每个字符串。

插图(可以是200位):

想法如何实施?谢谢

编辑

我在这里错过了什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;}

产出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a: 15
b: 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-12 02:45:14

可供选择

要管理一个大的结构化位集,您有以下选项:

  • C++位域:定义一个具有位字段成员的结构。您可以拥有任意多的成员,只要每个成员都没有比unsigned long long更多的位。 它非常容易使用;编译器为您管理对位或位组的访问。主要的不便是位布局依赖于实现。因此,这不是编写以二进制格式交换数据的可移植代码的选项。
  • 容器(无符号整型):定义一个足够大的数组以容纳所有位,并使用逻辑操作组合访问位或位组。它需要轻松地处理二进制操作,如果比特组被拆分为连续的元素,则不实用。为了以可移植的方式与外部世界交换二进制格式的数据,您需要处理大的和小的endian架构之间的差异,或者使用uint8_t的数组。
  • std::vector:给您完全的灵活性来管理您的比特。主要的限制是您需要分别处理每个位。此外,没有data()成员可以直接访问二进制数据。
  • std::位集:与vector<bool>非常类似,用于访问位。它在编译时具有固定的大小,但它提供了一些有用的特性,例如从字符串或流]5读取和写入ascci中的二进制文件,从整数类型的二进制值进行转换,以及对整个位集进行逻辑操作。
  • 这些技术的结合

做出你的选择

要以可移植的方式与外部世界通信,最简单的方法是使用位集。Bitset使用ascci '0‘或'1’(或其任何替代品)以一种格式提供简单的输入/输出/字符串转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

您还可以从/转换为二进制数据(但是只有一个元素,足够大到位集大小):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bitset<8> b(static_cast<uint8_t>(c));
cout<<b<<endl; 
cout<<b.to_ulong()<<endl;  

对于读/写大集,您需要读取小位集,并使用逻辑运算符将它们聚合到更大的位集中。这似乎很费时,它实际上非常接近于在容器中的积分,但不必考虑字节边界。

在您的示例中,具有固定大小的头和最大大小的bitset似乎是与外部世界交换二进制数据的一个不错的选择(但是要小心,因为变量部分是正确的)。

为了处理数据内容,访问特定位很容易,但您必须使用一些逻辑操作(shift和)来访问比特组。此外,如果您希望代码具有可读性和可维护性,最好抽象位布局。

结论:

因此,我强烈建议在内部使用(一种位字段结构)来处理数据,并与原始数据同时保持可比较的内存占用,同时使用位集来转换/转换到这个结构,以便进行外部数据交换。

票数 1
EN

Stack Overflow用户

发布于 2020-07-12 02:14:57

“最好的办法”取决于问题的细节。

如果整数符合可用的最大整数类型(通常长为长),则首先将字符串转换为整数(例如,假设C++11可用,使用stoi/stol/stoll函数)。然后使用位移位与二进制和(&)相结合来提取您感兴趣的值的部分。

如果整数不符合可用的最大整数类型,则将其拆分为字符串(使用substr函数),然后逐个将子字符串转换为整数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62859624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文