【问题标题】:Reading 32 bit hex data from file从文件中读取 32 位十六进制数据
【发布时间】:2015-07-30 18:05:17
【问题描述】:

从字节缓冲区中读取带符号的多字节字的最佳方法是什么?

是否有一种我不知道的标准方法来做到这一点,或者我是否在正确的轨道上阅读 4 个字符并将它们提高到 16 的相应幂并将它们加在一起?

int ReadBuffer(int BuffPosition, int SequenceLength){
    int val = 0;

    int limit = BuffPosition + SequenceLength;
    int place = 0;
for( BuffPosition; BuffPosition < limit; BuffPosition++ ){
    int current = Buff[BuffPosition];
    current *= pow(16, (2*place));
    val += current;
    place++;
}

return val;}

【问题讨论】:

  • 你关心字节序吗?
  • 没有“32 位十六进制数据”之类的东西。十六进制是二进制数据的字符串表示。文件中的内容几乎可以肯定是二进制的。
  • @EJP 可能 OP 只是想将 32 位字转储到文件中并稍后读取它们。我同意术语不正确。
  • 你是对的,我为我缺乏词汇而道歉。我想要做的是将 32 位整数写入文件,然后将它们读入缓冲区。然后从缓冲区中读取和操作它们。

标签: c++ binary hex


【解决方案1】:

我现在意识到我可以获取一个 char* 缓冲区并将其转换为具有正确大小的数据类型。

char* 8BitBuffer[4000];
int* 32BitBuffer;
if(sizeof(int) == 4){
     32BitBuffer = (int*)8BitBuffer;
}

dostuffwith(32BitBuffer[index]);

我正在尝试处理一个 wav 文件,因此为了最大限度地提高效率,我试图避免每秒读取 44100 次文件。这实际上是否比从数组中读取要慢,我不确定。

【讨论】:

    【解决方案2】:

    假设您在同一台机器上读/写文件(相同的字节序),您可以使用 32 位类型,如 int32_t (#include &lt;cstdint&gt;) 并直接读取。下面的小例子:

    #include <iostream>
    #include <fstream>
    #include <cstdint>
    
    int main()
    {
        std::fstream file("file.bin", std::ios::in | std::ios::out | std::ios::binary);
        const std::size_t N = 256; // length of the buffer
        int32_t buf[N]; // our buffer
        for (std::size_t i = 0; i < N; ++i) // fill the buffer
            buf[i] = i;    
    
        // write to file
        file.write((char*)buf, N * sizeof(int32_t));
        for (std::size_t i = 0; i < N; ++i) // zero-in the buffer
            buf[i] = 0; // to convince we're not cheating
    
        // read from file
        file.seekg(0); // rewind to beginning 
        file.read((char*)buf, N * sizeof(int32_t));
        // display the buffer
        for (std::size_t i = 0; i < N; ++i) // fill the buffer
            std::cout << buf[i] << " ";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2014-02-25
      • 1970-01-01
      • 2015-05-01
      • 2014-02-18
      相关资源
      最近更新 更多