二进制字符数组转换为字符串流并从缓冲区弹出
Binary char array into stringstream and pop from the buffer
我有 20 字节的二进制字符数组。我想分为 3 个部分:4 字节、8 字节、8 字节。我像下面这样实现它。它可以工作,但似乎我可以使用缓冲流。我想知道如何使用它。
现在
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++ 的新手,所以理解它需要时间。以下是安德斯·
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
它使用字符串::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
当我尝试谢夫的方式时,我遇到了一个错误。这是我的错,我想我可以解决它。我想我应该重新考虑_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;
不可能为std::stringstream
制作新方法。(至少,我不会推荐这个。
相反,我建议将其作为一个函数。用法将是类似的。
#include <bitset>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
string pop(istream &in, size_t n)
{
string ret;
while (n--) {
unsigned char byte = (unsigned char)in.get();
ret += bitset<8>(byte).to_string();
}
return ret;
}
int main()
{
string data(
"x11x22x33x44x55x66x77x88x99xaa"
"xbbxccxddxeexffxdexadxbexefx00", 20);
istringstream in; in.str(data);
string strA = pop(in, 4);
string strB = pop(in, 8);
string strC = pop(in, 8);
cout << "strA: '" << strA << "'" << endl;
cout << "strB: '" << strB << "'" << endl;
cout << "strC: '" << strC << "'" << endl;
return 0;
}
输出:
strA: '00010001001000100011001101000100'
strB: '0101010101100110011101111000100010011001101010101011101111001100'
strC: '1101110111101110111111111101111010101101101111101110111100000000'
注意:
使用
std::istream
使其适用于从std::istream
派生的任何流。pop()
中没有错误处理。因此,如果之后未good()
传递的流,则返回的pop()
结果可能是错误的。
顺便说一句。我同意std::stream
可能"过度设计"的评论。因此,这里是"轻量级"版本:
#include <bitset>
#include <iostream>
#include <string>
using namespace std;
string pop(const char *&iter, size_t n)
{
string ret;
while (n--) {
ret += bitset<8>((unsigned char)*iter++).to_string();
}
return ret;
}
int main()
{
const char data[] =
"x11x22x33x44x55x66x77x88x99xaa"
"xbbxccxddxeexffxdexadxbexefx00";
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;
return 0;
}
输出与上面相同。
注意:
对于出界访问,
char[]
和char*
的使用更加敏感。因此,必须谨慎使用。我不太确定
(unsigned char)
演员阵容是否必要。由于我经常看到关于char
、int
和符号扩展的"有趣"效果,我想它不会受到伤害。(我感觉好多了。
我可以向你推荐一个非常简单的替代方案,使用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
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 适用于大型数组的无复制线程安全环形缓冲区
- 缓冲区溢出 - 数组索引越界(严重)
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 在协议缓冲区 c++ 中反序列化字符串数组
- tiny_obj_loader到 Direct3D 顶点缓冲区和索引缓冲区数组
- 在缓冲区/数组中使用颜色结构
- 使用(非对象)API 时改变表数组C++而不重新创建整个平面缓冲区
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- 二进制字符数组转换为字符串流并从缓冲区弹出
- 如何将统一缓冲区对象数组加载到着色器中?
- OpenGL:使用指向静态数据的指针数组传递缓冲区数据
- 从 CImage AtlImage 获取缓冲区数组
- 线程安全的缓冲区数组
- 用变量初始化缓冲区数组的长度
- 在c++中声明一个缓冲区数组