在64位处理器中读取32位指针的结构

时间:2019-06-04 00:39:11

标签: c pointers arm 32bit-64bit

以定义的结构将32位指针传递给新的ARM 64位处理器

尝试读取使用在另一硬件中的32位处理器中创建的32位指针结构的旧代码,该结构在使用64位指针的64位处理器的公共存储区中传递。

struct _32bit_addr_ptr 
{
 unsigned int *addr1;
 unsigned int *addr2;
 unsigned int *addr3;
}test;
test.addr1 = 0x12345678;
test.addr2 = 0x23456781;
test.addr3 = 0x34567812;

所以数据看起来像这样。
大字节序中的数据块如下所示:

1234 5678 2345 6781 3456 7812  

如果我在64位指针中使用相同的结构,则它当然会为每个地址使用8个字节,而不会给出正确的结果。

是否有一种方法可以在结构中的64位处理器中定义该结构,而不必使用不使用指针的结构以及该结构外部的强制转换来转换它?

struct _32bit_address
{
 unsigned int addr_value1;
 unsigned int addr_value2;
 unsigned int addr_value3;
}test2;

unsigned long long Addr_ptr = (unsigned long long *)(test2.addr_value1)

1 个答案:

答案 0 :(得分:1)

指针必须与寻址区域一样宽,因此在您的情况下,指针必须为64位。

但是,如果这些结构是由某个例程动态生成的,则可以尝试将其转换为64位基址的偏移量,如果偏移量小于65536,则为32位或更好的16位偏移量。

为此,您必须同时修改地址生成器和使用这些结构的地址生成器。

没有其他事情是不可能的。

要么使用64位指针,要么在周围进行大量修改。