逐字节读取存储器

时间:2012-02-09 19:52:48

标签: c++ arrays memory

我有一个很长的[],我想一次读两位。我的数据是二进制数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),但加号当然知道它的长度大小会增加相应的值。

5 个答案:

答案 0 :(得分:2)

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

unsigned char* p = (char *)t;

并使用 p 指针。

答案 1 :(得分:1)

好吧,你总是可以把一个指针转换成char *来逐字节地获取它,如果你还需要一次读取它2个字节,你需要使用&和适当的位掩码(即0x3以获得最低的2位)。如果您愿意,您可以随时使用<<<<<或>>运算符在当前字节中进一步向上或向下匹配。

答案 2 :(得分:1)

使用std::vector<bool>代替long[]。可以使用

来检索i'2位块
(int(v[i*2]) << 1) | v[i*2+1]

答案 3 :(得分:0)

一些简单的算术:

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
     }
}

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

答案 4 :(得分:0)

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

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

......等等

编辑:顺便说一句,t会自动衰减到指针,没有必要&t,你只是让自己更加困惑。