好吧,要么我疯了,要么IBM编译器中有一个错误

Kel*_*ard 5 c++ stringstream

如果他们能告诉我为什么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)

Rod*_*ddy 7

现在是时候将蜂巢评论线程转化为类似有用答案的东西......

0x05给你带来问题,因为你的AS/400使用EBCDIC编码,这是一个制表符.在ASCII系统上,字符0x09(tab)给出了类似的问题.

<<>>运营商stringstream格式化的输入和输出,所以空白字符(如制表符,空格-和行结尾)可以得到改变.

您应该std::stringstream::binary在构造流时使用该选项,以防止更改换行序列.

此外,您必须告诉格式化的读取操作符不要使用noskipwsI/O操纵器跳过流中的空格.

或者,您可以将数据保存到通用容器(例如std :: vector或std :: string)并完全避免这种麻烦.