如果他们能告诉我为什么streamstream<<(char)忽略0x05,我会给任何人买啤酒.这个节目正在制作中000102030406070809E280081150121314
我认为预期的输出更像是:
00010203040506070809E2800811050505050505050550121314
IBM i(aka AS/400)C++编译器,在V7R1上运行.
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <stdint.h>
using namespace std;
typedef int8_t byte;
int main(int argc, char* argv[])
{
stringstream sstr2;
sstr2 << char(0x00);
sstr2 << char(0x01);
sstr2 << char(0x02);
sstr2 << char(0x03);
sstr2 << char(0x04);
sstr2 << char(0x05);
sstr2 << char(0x06);
sstr2 << char(0x07);
sstr2 << char(0x08);
sstr2 << char(0x09);
sstr2 << char(0xe2);
sstr2 << char(0x80);
sstr2 << char(0x08);
sstr2 << char(0x11);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x05);
sstr2 << char(0x50);
sstr2 << char(0x12);
sstr2 << char(0x13);
sstr2 << char(0x14);
char c;
sstr2 >> c;
while (sstr2.good()) {
cout << hex << uppercase << setw(2) << setfill('0') << (int)c;
sstr2 >> c;
}
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
现在是时候将蜂巢评论线程转化为类似有用答案的东西......
0x05给你带来问题,因为你的AS/400使用EBCDIC编码,这是一个制表符.在ASCII系统上,字符0x09(tab)给出了类似的问题.
在<<和>>运营商stringstream是格式化的输入和输出,所以空白字符(如制表符,空格-和行结尾)可以得到改变.
您应该std::stringstream::binary在构造流时使用该选项,以防止更改换行序列.
此外,您必须告诉格式化的读取操作符不要使用noskipwsI/O操纵器跳过流中的空格.
或者,您可以将数据保存到通用容器(例如std :: vector或std :: string)并完全避免这种麻烦.