逐字节读取内存

reading memory byte by byte

本文关键字:内存 读取 字节      更新时间:2023-10-16

我有一个长[],我想一次读取两位。我的数据是二进制数字00,01,10和11,它们首尾相连,填充在一个长数组中,然后填充在数组中。

我将一次读取这些数据的很长一段,可能从读到一半开始,而且直接从内存中读取,一次读取两个字节似乎更有意义,而不是通过长[]迭代,然后用掩码一次提取两个比特。

我似乎不知道该怎么做,而且我从来都不擅长直接访问内存(自从我在java上长大以来)。

我试过实例化一个数组

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

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

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

unsigned char* p = (char *)t;

并使用p指针。

好吧,你总是可以将指针投射到char*,以逐字节获取它,如果你还需要每次读取2个字节,你需要使用&以及适当的位掩码(即0x3以获得最低的2位)。如果你愿意,你总是可以用<lt;或>>运算符,以便在当前字节中进一步向上或向下匹配。

为此使用std::vector<bool>而不是long[]。可以使用检索第5个CCD_ 2位块

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

一些简单的算法:

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)

将数组强制转换为unsigned char *并打印。前两个字节(端序除外)将是:

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

等等

编辑:顺便说一句,t会自动衰减到一个指针,没有必要执行&t,你只是在进一步混淆自己。