了解更多背景,see here
我使用stringstream
来读取二进制数据。截至目前,我只是在编写一个虚拟程序来熟悉课程。这是我的计划:
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;
string bytes2hex(char* bytes, int n){
stringstream out;
for (int i = 0;i < n;i++){
out << setfill ('0') << setw(2) << hex << (int) bytes[i] << " ";
}
string st = out.str();
for(short k = 0; k < st.length(); k++)
{
st[k] = toupper(st[k]);
}
return st;
}
int main(){
stringstream ss;
ss << "hello the\0re my\0\0\0 friend";
while (ss.peek() != EOF){
char buf [2];
ss.get(buf, 3);
cout << buf << "\t==>\t" << bytes2hex(buf, 2) << endl;
}
}
输出:
he ==> 68 65
ll ==> 6C 6C
o ==> 6F 20
th ==> 74 68
e ==> 65 00
==> 00 00
我有两个问题:
ss.get()
时,我必须输入3而不是2,一次读取2个字符的流?答案 0 :(得分:3)
关于第一个问题:
istream::get
想要形成一个有效的C风格的字符串,因此它被指定为读取一个小于你传递的buffersize的字符,并在最后一个位置存储一个'\0'
字符。 />
实际上,您还应该将buf
扩展为3个字节,因此ss.get
将保留在边界内。
关于第二个问题:
第一个'\0'
字符的切断发生在插入到字符串流中。原因是,当您插入C样式的字符串(并包含字符串文字)时,代码会停止在第一个'\0'
字符处理它,因为这是C样式字符串的定义。
您可以通过以下方式正确填充数据流:
ss << string("hello the\0re my\0\0\0 friend", 25);
25
来自二进制输入的长度。
答案 1 :(得分:1)
istream.get用于读取文本数据,并在读取n-1个字符或遇到\n
时停止读取。如果要读取二进制数据,请使用:
ss.read(buf, 2)