1

我正在处理一个家庭作业问题,从二进制文件打印。我搜索并发现我的问题是符号扩展问题。

在 c 中,正确的操作是强制转换为 (unsigned char)

我已经尝试过这个解决方案,但它不适用于 cout

带有(无符号)的输出是:

4D 5A FFFFFF90 00 03 00 00 00 04 00 00 00 FFFFFFFF FFFFFFFF 00 00 

(unsigned char) 的输出是:

0M 0Z 0ê 0� 0 0� 0� 0� 0 0� 0� 0� 0ˇ 0ˇ 0� 0� 

任何指导都是最有帮助的;

这是代码:

void ListHex(ifstream &inFile)
{
    // declare variables
    char buf[NUMCHAR];
    unsigned char bchar;

    while(!inFile.eof())
    {
       inFile.read(buf,NUMCHAR);
       for (int count = 0; count < inFile.gcount(); ++count)
       {

        cout << setfill('0') << setw(2) << uppercase << hex << 
           (unsigned)buf[count] << ' ';
       }
       cout << '\n';
   }
}
4

4 回答 4

2

怎么样cout <<setfill('0') << setw(2) << uppercase << hex << (0xFF & buf[count])

于 2013-03-01T19:35:41.337 回答
1
void ListHex(std::istream& inFile) {
    // declare variables
    char c;
    while(inFile >> c) {
        std::cout << std::setw(2) << std::hex 
                  << static_cast<int>(c);
    }
}

我建议逐个字符地执行此操作,原因是在处理 rinterpretive int 转换时,我什至不想考虑各种字节序问题。无论如何,std::ifstream它将为您缓冲字符(您的操作系统也可能如此)。

请注意我们如何接收文件流,因为std::istream它允许我们传入任何类型的istreaminclude和.std::istringstreamstd::cinstd::ifstream

例如:

 ListHex(std::cin); 

 std::istringstream iss("hello world!");
 ListHex(iss);

将十六进制您的用户输入。

编辑

使用缓冲区

void ListHex(std::istream& inFile) {
    // declare variables

    char arr[NUMCHAR];

    while(inFile.read(arr, NUMCHAR)) {
        for(std::size_t i=0; i!=NUMCHAR; ++i) {
            std::cout << std::setw(2) << std::hex 
                      << static_cast<int>(arr[i]);
        }
    }
}
于 2013-03-01T19:35:24.237 回答
0

您可以通过屏蔽高位来摆脱符号扩展:

(((unsigned) buf[count)) & 0xff)
于 2013-03-01T19:38:29.443 回答
0

std::cout 将 unsigned char 打印为字符,而不是整数。您可以在这里执行两次演员表 - 类似于以下内容:

static_cast <int> (static_cast <unsigned char> (buf[count]))

或者,使用 unsigned char 缓冲区和单个强制转换:

void ListHext(ifstream& inFile)
{
    unsigned char buf[NUMCHAR];
    while (inFile.read(reinterpret_cast <char*> (&buf[0]), NUMCHAR))
    {
        for (int i=0; i < NUMCHAR; ++i)
            cout << ... << static_cast <int> (buf[i]) << ' ';
        cout << endl;
    }
}

编辑:此处不应使用掩码,因为它假定特定的字符大小。以下仅在 CHAR_BIT 为 8 时等效:

// bad examples
x & 0xFF // note - implicit int conversion
static_cast <int> (x) & 0xFF // note - explicit int conversion

// good example
static_cast <int> (static_cast <unsigned char> (x))
于 2013-03-01T19:43:13.717 回答