gpt4 book ai didi

c++ - 使用C++解析二进制数据的长字符串

转载 作者:行者123 更新时间:2023-12-02 10:00:23 24 4
gpt4 key购买 nike

我正在寻找如何解析长二进制数据的想法,例如:“10100011111000111001”
位:0-4是ID
5-15位是数据
等等等等
二进制数据结构可以更改,因此我需要建立一种数据库将如何存储数据以解析每个字符串。
插图(可能是200位):
enter image description here
想法如何执行呢?
谢谢
编辑
我在这里想念什么?

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

最佳答案

可用选项
要管理一组较大的结构化位,您可以使用以下选项:

  • C++ bit-fields :您定义具有位域成员的结构。您可以根据需要拥有任意数量的成员,只要每个成员的位数不超过unsigned long long即可。
    它非常易于使用;编译器为您管理对位或位组的访问。主要的不便之处在于位的布局取决于实现方式。因此,这不是编写以二进制格式交换数据的可移植代码的选项。
  • 无符号整数类型的容器:您定义一个足够大的数组以容纳所有位,并使用逻辑运算的组合访问位或位组。
    它要求二进制操作时要放心,并且如果将位组划分为连续的元素则不切实际。为了以一种便捷的方式与外界交换二进制格式的数据,您需要注意大小端架构之间的差异,或者使用uint8_t数组。
  • std::vector<bool> :使您可以完全灵活地管理位。主要约束是您需要分别寻址每个位。而且,没有data()成员可以直接访问二进制数据。
  • std::bitset :非常类似于vector<bool>来访问位。它在编译时具有固定的大小,但是提供了有用的功能,例如从字符串或流中以ascci格式读取和写入二进制文件5,从整数类型的二进制值转换以及对整个位集进行逻辑运算。
  • 这些技术的组合

  • 做出你的选择
    为了以一种可移植的方式与外界通信,最简单的方法是使用位集。位集使用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;
    对于读/写大集合,您需要读取小位集并使用逻辑运算符将它们聚合到更大的位集中。这似乎很耗时,实际上与您在积分容器中所做的非常接近,但是不必关心字节边界。
    在您的情况下,使用固定大小的 header 和最大大小, bitset似乎是与外部世界交换二进制数据的不错选择(但是要小心,因为可变部分是正确的)。
    为了处理数据内容,很容易访问特定的位,但是您必须使用一些逻辑运算(移位和)来访问位组。此外,如果您想要可读且可维护的代码,则最好抽象化位布局。
    结论:
    因此,我强烈建议在内部使用 一个位域结构来处理数据,并同时保持与原始数据 相当的内存占用,使用位集只是为了从该结构转换为该结构/ 外部数据交换的目的。

    关于c++ - 使用C++解析二进制数据的长字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62859624/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com