将数组中的连续字节转换为指针而不使用shift

时间:2016-08-25 16:01:07

标签: c arrays pointers

我有一个包含地址的二维数组。地址从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;

4 个答案:

答案 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];