【问题标题】:reading memory byte by byte逐字节读取内存
【发布时间】:2012-02-09 19:52:48
【问题描述】:

我有一个 long[],我想一次读取两个位。我的数据是二进制数 00、01、10、11 首尾相连,塞进一个长整数,然后塞进一个数组。

我将一次读取一段很长的数据,可能从中途开始,似乎直接从内存中读取更有意义,一次两个字节,而不是遍历 long[ ] 并使用掩码一次拉出两个位。

我似乎不知道该怎么做,而且我从来没有擅长直接访问内存(因为我是在 java 上长大的)。

我试过实例化一个数组

unsigned long t[5];
t[0] = 4294967295;
t[1] = 0;
t[2] = 4294967294;
t[3] = 4294967296;
t[4] = 1;

然后打印*(&t)*(&t+1),但是加号当然知道它是long的大小,然后加上适当的值。

【问题讨论】:

    标签: c++ arrays memory


    【解决方案1】:

    使用指向字节大小的数据类型的指针。试试这个:

    unsigned char* p = (char *)t;
    

    并使用p指针。

    【讨论】:

    • unsigned char 会好一点
    【解决方案2】:

    好吧,您总是可以将指针转换为 char*,以逐字节获取它,如果您还需要一次实际读取 2 个字节,则需要使用 & 和适当的位掩码(即0x3 获取最低 2 位)。如果需要,您可以随时使用 > 运算符移动此掩码,以在当前字节中进一步向上或向下匹配。

    【讨论】:

      【解决方案3】:

      为此使用std::vector<bool> 而不是long[]。检索i'th 2 位块可以使用

      (int(v[i*2]) << 1) | v[i*2+1]
      

      【讨论】:

      • 我实际上最终会使用它,因为我真的很喜欢这个解决方案的雄辩。但是,我将另一个答案标记为正确,因为它更接近于我的问题措辞方式的解决方案。干杯。
      【解决方案4】:

      一些简单的算术:

      for (unsigned int i = 0; i != 5; ++i)
      {
           for (unsigned int k = 0; k != CHAR_BIT * sizeof(unsigned long int); k += 2)
           {
               std::printf("%02X ", n % 3);  // print last two bits
               n /= 4;                       // move down by two bits
           }
      }
      

      你当然可以说sizeof(t)/sizeof(t[0])而不是5,如果这是一个选项,或者你可以使用迭代器std::begin(t)/std::end(t)

      【讨论】:

        【解决方案5】:

        将数组转换为unsigned char * 并打印出来。前两个字节(除了字节序)将是:

        ((unsigned char *)t)[0]
        ((unsigned char *)t)[1]
        

        ...等等

        编辑:顺便说一句,t 会自动衰减为自己的指针,没有必要这样做 &amp;t,你只会让自己更加困惑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          • 2011-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多