我有一个包含地址的二维数组。地址从code[line][1]
开始。它长4个字节。我需要将其转换为指针而不使用shift。
下面是我使用轮班的代码,它工作正常。如果我可以将这些字节放入long
中,那么我可以将long
转换为指针。此外,如果字节顺序错误,我可以在其他地方更改我的代码以获得正确的endian样式。没有函数调用。
尝试搜索这方面的例子很难,因为他们都展示了如何通过轮班来做到这一点。
unsigned long address = (((unsigned long) code[line][1]) << 24) +
(((unsigned long) code[line][2]) << 16) +
(((unsigned long) code[line][3]) << 8) +
code[line][4];
unsigned int *add = (unsigned int*) address;
答案 0 :(得分:1)
在具有小型处理器和系统(即编译器,操作系统等)的嵌入式系统中,在项目的生命周期中不太可能发生变化,制作非可移植代码是有意义的。换句话说:可以在此系统上运行但可能在其他系统上运行的代码。
如果您不关心可移植性,只需将code[line][x]
中的字节直接复制到最终指针即可。请注意,它需要使用正确的字节顺序并使用正确的指针大小。
这样的事情(假设一个4字节指针并假设code
包含字节):
unsigned int* add;
char* tmp = (char*)&add;
tmp[0] = code[line][4];
tmp[1] = code[line][3];
tmp[2] = code[line][2];
tmp[3] = code[line][1];
// Now you can use add as a pointer
如果您的系统具有相反的字节序,请从索引1开始,以索引4结束。
再一次 - 这是不可移植的代码。
答案 1 :(得分:1)
我想我明白了......
add = (unsigned int*) (*((unsigned long*) &code[line][1]));
我把指针指向第一个字节并将其转换为长指针...然后取long的值可以将它转换为int指针..不得不改变我的endian
答案 2 :(得分:0)
你可以使用联盟。像这样:
union un{
char bytes[4]; //assuming the size of the array is [x][4]
int* address;
};
un code[numLines];
你可能需要稍微移动一些东西。这就像使用代码[line] [0]到[3]而不是代码[line] [1]到[4]
另外,请确保系统的字节顺序适用于此方法。
答案 3 :(得分:0)
您可以使用union
!
union {
char ch[4];
unsigned int *ptr;
} add;
add.ch[0] = code[line][4];
add.ch[1] = code[line][3];
add.ch[2] = code[line][2];
add.ch[3] = code[line][1];