逐字节读取内存
reading memory byte by byte
我有一个长[],我想一次读取两位。我的数据是二进制数字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
,你只是在进一步混淆自己。
相关文章:
- 我无法从内存中读取值
- 如何读取特定地址的进程内存?
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 如何在 WSL 2 中读取物理内存?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 从只读内存中读取结构
- 当注入程序的内存空间时,如何读取从 0 到 0xFFFFFFFFF 的每个字节?我正在创建模式扫描仪
- 如何运行外部程序,向其传递内存地址以读取/写入?
- C++指针将内存读取为 0
- 读取进程内存多级指针(DLL 注入)
- 组织从内存读取的数据的最佳方法(用于调试)c++
- 使用ClgetDeviceInfo从内存读取访问违规
- C++ - 分叉进程无法从共享内存读取
- C# 简化多指针的内存读取
- Linkedlist内存读取错误
- 从原始内存读取值(符合MISRA)
- c++ DLL内存读取崩溃
- 在wwpal rabbit中从内存读取数据
- c++中什么是预内存读取?
- 优化内存读取和写入的长期运行