std :: hex不能像我期望的那样工作

时间:2017-03-20 11:37:47

标签: c++

我不熟悉C ++,所以请耐心等待......

从设备读取两个字节并进入缓冲区。 然后打印出来。

下面的代码应该返回字符串" 0x204D" 然而,它返回" 0x M"其中十六进制为30 78 20 4d

因此十六进制不会被解码为ascii。

void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen)
{
    std::stringstream *decodedClearText;
    decodedClearText = new std::stringstream;

    *decodedClearText << "0x" << std::hex;

    for (int i=0; i<bufferLen; i++) {
            *decodedClearText << buffer[i];
    }
    setValue(decodedClearText->str());
}

应该怎么做?

3 个答案:

答案 0 :(得分:3)

这与std::hex无关。

当您流式传输[signed/unsigned] char时,会使用其ASCII表示形式,因为这通常是char的预期结果。

您可以将号码转换为int。然后将触发以十六进制表示法(即std::hex)呈现数字的功能。

您还应该修复内存泄漏和不必要的动态分配:

void vito_unit::decodeAsRaw(unsigned char const* const buffer, int const bufferLen)
{
    std::stringstream decodedClearText;
    decodedClearText << "0x" << std::hex;

    for (int i = 0; i < bufferLen; i++) {
       decodedClearText << +buffer[i];
    }

    setValue(decodedClearText.str());
}

一元“+”对int执行整体提升。

答案 1 :(得分:2)

select dateadd(second, col, '1970-01-01') . . . 的类型为buffer[i],因此打印为字符而不是十六进制表示。您可以将值转换为unsigned char以避免这种情况。

unsigned int

答案 2 :(得分:2)

Bo Persson的暗示是我所需要的。

 for (int i=0; i<bufferLen; i++) {
        *decodedClearText << (int)buffer[i];
}

做了这个伎俩。