如果他们能告诉我streamstream<<(char)忽略0x05的原因,我会给任何人买啤酒。
该程序正在生成000102030406070809E280081150121314
我认为预期的输出应该更像是:00010203040506070809E2800811050505050505050550121314
在V7R1上运行的IBM i(也称为AS/400)C++编译器。

#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;
}

最佳答案

是时候将 hive 式注释线程分解为类似于有用答案的内容了...

0x05给您带来了问题,因为您的AS/400使用EBCDIC编码,这是一个制表符。在ASCII系统上,字符0x09(制表符)也存在类似的问题。
<<>>stringstream运算符用于格式化的输入和输出,因此可以更改空白字符(例如,制表符,空格和行尾)。

构造流时,应使用选项 std::stringstream::binary ,以防止换行符序列被更改。

另外,您还必须使用 noskipws I/O操作器,告诉格式化的读取操作符不要跳过流中的空白。

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

关于c++ - 好吧,要么我疯了,要么是IBM的编译器中有一个错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25024727/

10-10 20:17