首页 文章

使用C中的按位移位器和缓冲器读取二进制文件

提问于
浏览
0

我正在尝试读取二进制文件并将数据简单地转换为可用的无符号整数 . 对于某些文件位置,下面的代码适用于2字节读取,并正确打印无符号整数 . 当我使用4字节代码时,虽然我的值变成了一个比它应该大得多的数字 . 我认为问题在于读取功能,似乎我得到了错误的字符/十进制数(例如101),当位移变成比它应该大得多的数字时(~6662342) . (当程序时)运行它会立即引发异常,然后“在视觉工作室中堆栈变量buf运行时错误#2” . 有任何想法吗?这可能是我对如何将数据存储在影响我的数据输出的char数组中的基本知识 .

工作2字节代码

unsigned char buf[2];
    file.seekg(3513);
    uint64_t value = readBufferLittleEndian(buf, &file);

    printf("%i", value);

    system("PAUSE");
    return 0;

}


uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file)
{
    file->read((char*)(&buf[0]), 2);
    return (buf[1] << 8 | buf[0]);
}

破解的4字节代码

unsigned char buf[8 + 1]; //= { 0, 2 , 0 , 0 , 0 , 0 , 0, 0, 0 };
    uint64_t buf1[9];
    file.seekg(3213);
    uint64_t value = readBufferLittleEndian(buf, &file, buf1);

    std::cout << value;


    system("PAUSE");
    return 0;

}


uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file, uint64_t buf1[])
{
    file->read((char*)(&buf[0]), 4);
    for (int index = 0; index < 4; index++)
    {
        buf1[index] = buf[index];
    }
    buf1[0];
    buf1[1];
    buf1[2];
    buf1[3];
    //return (buf1[7] << 56 | buf1[6] << 48 | buf1[5] << 40 | buf1[4] << 32 | buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
    return (buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
    //return (buf1[1] << 8 | buf1[0]);
}
Please correct me if I got the endianess reversed.

代码是C,除了printf行

2 回答

  • 1

    你必须在转移前施放 . 你不能将一个字符向左移56位 .

    即做 ((uint64_t)buf[n] << NN

  • 0

    Seekg(0)=字节1,seekg(3212)=字节3213.不完全确定为什么我之前在字节3214中得到零,考虑到我现在得到220(表示大端) . 获得220将表明我正在解释seekg()的功能 . 哦,无论如何,现在重要的是它已经解决了 .

相关问题