2

我知道这个标题可能听起来令人困惑。我有一个简单的问题,我还没有解决。

假设我有一个文件,用十六进制编辑器打开它显示它里面有两个字符,比如0x1B0x00(显然无法打印)。我想将其视为HEX中的1B00,即DEC中的6912,而不是直接转换错误的字符,这是我看到的所有其他问题所问的问题。嗯,这就是我想在这里做的任务。看起来很简单,但我尝试过的一切都做错了!即使我显然是以二进制模式打开文件。

我只设法单独读取字符,并弄乱了一点,但从不做我真正想要的,这就像取这两个十六进制字符一样简单,将它们解释为十六进制数,然后将其转换为十进制。

抱歉有任何不清楚的想法,我不是母语人士。任何帮助将不胜感激,我相信您会认为这是一个相当愚蠢的问题:P

编辑:对不起,显然我没有正确解释自己。我知道这可能看起来很抽象,但这是一件非常具体的小事,我一直在努力解决,但我一直没能解决。也许我可以换一种方式问:

如何以二进制模式扫描字符,比如说0x1B,并将其转换为实际的1B字符。只是。

4

3 回答 3

2

听起来您想将文件作为原始数据读取,然后以十进制显示在屏幕上?超级简单!

int main() {
    std::ifstream myfile("filename.data", std::ofstream::binary);
    uint16_t number;
    char* buffer = (char*)(&number);
    while(myfile.read(buffer, sizeof(number))) {
        std::cout << number << ' ';
    }
}

它如此简单的原因是不涉及十六进制。该文件保存为一系列字节,每个字节包含 256 个值中的一个。它们不是十六进制的,它们只是一系列值。如果您将两个字节读入uint16_t,这是将两个字节解释为单个无符号 2 字节值的最简单方法。默认情况下,流出的uint16_t遗嘱会以十进制显示该值。不涉及十六进制。您在十六进制编辑器中看到的十六进制是因为十六进制编辑器将字节解释为十六进制值

于 2013-07-17T23:43:44.443 回答
1

如果您只想以十六进制形式打印一个数字,请使用std::hex

int i = 0x1B;
std::cout << std::hex << i << std::endl;
于 2013-07-17T23:17:22.137 回答
0
std::ifstream infile("test.bin", std::ofstream::binary);

while (true) 
{
    char c1 = ifs.get();
    if (!infile.good())
    {
        break;
    }

    char c2 = ifs.get();
    if (!infile.good())
    {
        break;
    }

    int num = (int)c1 |((int)c2 << 8);

    // if you need the oppisite order then
    // int num = (int)c2 &((int)c1 << 8);
    cout << num;
}
于 2013-07-17T23:24:03.603 回答