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