二进制字符数组到 stringstream 并从缓冲区弹出

我有 20 字节的二进制字符数组。我想分成3个部分:4byte、8byte、8byte。我像下面这样实现它。它有效,但似乎我可以使用缓冲区流。我想知道如何使用它。

现在

void main()
{
    // _data is 20byte binary char array. 0000000000000000000000000000000000000000000001111001110001111111001110000010110000001011101101000000000000000000000000000000000000000000000000000000000000000001

    // strA (4 byte)
    string strA;
    for (std::size_t i = 0; i < 4; ++i) {
        strA += bitset<8>(_data.c_str()[i]).to_string();
    }

    cout << strA << endl; // 00000000000000000000000000000000

    // strB (8 byte)
    string strB;
    for (std::size_t i = 4; i < 12; ++i) {
        strB += bitset<8>(_data.c_str()[i]).to_string();
    }

    cout << strB << endl; // 0000000000000111100111000111111100111000001011000000101110110100

    // strC (8 byte)
    string strC;
    for (std::size_t i = 12; i < 20; ++i) {
        strC += bitset<8>(_data.c_str()[i]).to_string();
    }

    cout << strC << endl; // 0000000000000000000000000000000000000000000000000000000000000001
}

期待

我想这样实现。

void main()
{
    stringstream ss = _data;
    strA = ss.pop(4);
    strB = ss.pop(8);
    strC = ss.pop(8);
}

更新 1

感谢你们。我正在一一尝试你给我的所有答案。我是 C++ 的新手,所以需要时间来理解它。以下是 Anders K 的一篇。

struct S { char four[4]; char eight1[8]; char eight2[8]; }; 
struct S *p = reinterpret_cast<S*>(&_data); 
cout << p->four << endl; // => Output "(" I think I can find way to output

更新 2

它使用 string::substr 工作。谢谢扎基尔。

int main()
{
    // I don't know how to change to string value in smart way.. 
    string str;
    for (std::size_t i = 0; i < _data.size(); ++i) {
        str += bitset<8>(_data.c_str()[i]).to_string();
    }

    cout << str << endl; // 0000000000000000000000000000000000000000000001111001110001111111001110000010110000001011101101000000000000000000000000000000000000000000000000000000000000000001

    std::string d = str; // Your binary stream goes here
    int lenA = (4*8);  // First  4 Bytes
    int lenB = (8*8);  // Second 8 Bytes
    int lenC = (8*8);  // Last   8 Bytes

    std::string strA = d.substr(0,    lenA);
    std::string strB = d.substr(lenA + 1, lenB - 1);
    std::string strC = d.substr(lenA + lenB + 1, lenC - 1);

    cout << strA << endl; // 00000000000000000000000000000000
    cout << strB << endl; // 000000000000111100111000111111100111000001011000000101110110100
    cout << strC << endl; // 000000000000000000000000000000000000000000000000000000000000001
}

更新 3

当我尝试 Scheff 的方式时出现错误。这是我的错,我想我可以解决它。我认为我应该重新考虑 _data 的类型。

int main
{
    const char data = _data;
    const char *iter = data;
    string strA = pop(iter, 4);
    string strB = pop(iter, 8);
    string strC = pop(iter, 8);
    cout << "strA: '" << strA << "'" << endl;
    cout << "strB: '" << strB << "'" << endl;
    cout << "strC: '" << strC << "'" << endl;
}

制作错误信息

error: no viable conversion from 'string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') to
  'const char'
const char data = _data;
扎基尔

我可以为您提供一个非常简单的替代方案string::substr

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string _data="00010001001000100011001101000100\
0101010101100110011101111000100010011001101010101011101111001100\
1101110111101110111111111101111010101101101111101110111100000000";

  int lenA = (4*8);  //First 4 Bytes
  int lenB = (8*8);  //Second 8 Bytes
  int lenC = (16*8); //Last 16 Bytes

  string strA = _data.substr(0,    lenA - 1);
  string strB = _data.substr(lenA, lenB - 1);
  string strC = _data.substr(lenB, lenC - 1);

  std::cout << "strA: " << strA <<  endl;
  std::cout << "strB: " << strB <<  endl;
  std::cout << "strC: " << strC <<  endl;


  return 0;
}

这既简洁又简单,但可以完成您的工作!
演示在这里

输出:-

strA: 0001000100100010001100110100010
strB: 010101010110011001110111100010001001100110101010101110111100110
strC: 100110011010101010111011110011001101110111101110111111111101111010101101101111101110111100000000

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从文件读入并从缓冲区输出到另一个数组

来自分类Dev

std :: stringstream直接输出缓冲区/字符串结果访问,避免复制?

来自分类Dev

std :: stringstream缓冲区操作

来自分类Dev

NodeJS读取二进制浮点缓冲区

来自分类Dev

将二进制数据写入缓冲区

来自分类Dev

C ++:将读取的二进制文件存储到缓冲区

来自分类Dev

节点缓冲区,从utf8到二进制

来自分类Dev

VHDL-BCD到二进制输入缓冲区-显示结果的问题

来自分类Dev

如何将字符串转换为二进制缓冲区?

来自分类Dev

将二进制文件读入无符号字符向量缓冲区

来自分类Dev

使用StringStream在C ++中读取二进制文件

来自分类Dev

从缓冲区中提取字符串

来自分类Dev

在协议缓冲区消息中存储二进制数据缓冲区

来自分类Dev

如何将数据 URI 转换为缓冲区(带二进制的字符串)?

来自分类Dev

如何将o / p存储到缓冲区,然后从缓冲区存储到文件

来自分类Dev

文件流将十六进制文件读入二进制缓冲区

来自分类Dev

将任何文件转换为二进制字符串并从二进制转换为文件

来自分类Dev

在C ++中管理二进制数据的缓冲区

来自分类Dev

socket.io二进制缓冲区的优点?

来自分类Dev

使用协议缓冲区发送二进制数据的正确方法是什么?

来自分类Dev

在Linux上从char缓冲区写入二进制文件

来自分类Dev

在C ++中管理二进制数据的缓冲区

来自分类Dev

将int写入二进制缓冲区(Android)并使用C ++读取

来自分类Dev

在Perl中将“文件” Linux命令应用于二进制缓冲区

来自分类Dev

C二进制文件读取缓冲区声明位置差异

来自分类Dev

从二进制缓冲区初始化变量的正确方法是什么?

来自分类Dev

如何将C二进制缓冲区转换为Python字符串中的十六进制表示形式?

来自分类Dev

使用ifsream和stringstream复制二进制文件时出错

来自分类Dev

std :: stringstream具有二进制数据的流运算符

Related 相关文章

  1. 1

    如何从文件读入并从缓冲区输出到另一个数组

  2. 2

    std :: stringstream直接输出缓冲区/字符串结果访问,避免复制?

  3. 3

    std :: stringstream缓冲区操作

  4. 4

    NodeJS读取二进制浮点缓冲区

  5. 5

    将二进制数据写入缓冲区

  6. 6

    C ++:将读取的二进制文件存储到缓冲区

  7. 7

    节点缓冲区,从utf8到二进制

  8. 8

    VHDL-BCD到二进制输入缓冲区-显示结果的问题

  9. 9

    如何将字符串转换为二进制缓冲区?

  10. 10

    将二进制文件读入无符号字符向量缓冲区

  11. 11

    使用StringStream在C ++中读取二进制文件

  12. 12

    从缓冲区中提取字符串

  13. 13

    在协议缓冲区消息中存储二进制数据缓冲区

  14. 14

    如何将数据 URI 转换为缓冲区(带二进制的字符串)?

  15. 15

    如何将o / p存储到缓冲区,然后从缓冲区存储到文件

  16. 16

    文件流将十六进制文件读入二进制缓冲区

  17. 17

    将任何文件转换为二进制字符串并从二进制转换为文件

  18. 18

    在C ++中管理二进制数据的缓冲区

  19. 19

    socket.io二进制缓冲区的优点?

  20. 20

    使用协议缓冲区发送二进制数据的正确方法是什么?

  21. 21

    在Linux上从char缓冲区写入二进制文件

  22. 22

    在C ++中管理二进制数据的缓冲区

  23. 23

    将int写入二进制缓冲区(Android)并使用C ++读取

  24. 24

    在Perl中将“文件” Linux命令应用于二进制缓冲区

  25. 25

    C二进制文件读取缓冲区声明位置差异

  26. 26

    从二进制缓冲区初始化变量的正确方法是什么?

  27. 27

    如何将C二进制缓冲区转换为Python字符串中的十六进制表示形式?

  28. 28

    使用ifsream和stringstream复制二进制文件时出错

  29. 29

    std :: stringstream具有二进制数据的流运算符

热门标签

归档