C 不使用shift将数组中的连续字节转换为指针
我有一个包含地址的2d数组。地址从C 不使用shift将数组中的连续字节转换为指针,c,arrays,pointers,C,Arrays,Pointers,我有一个包含地址的2d数组。地址从code[line][1]开始。它有4个字节长。我需要在不使用shift的情况下将其转换为指针 下面是我在轮班时使用的代码,它运行良好。如果我能把这些字节转换成一个long,那就行了,因为我能把long转换成指针。此外,如果字节顺序错误,我可以在其他地方更改代码,以获得正确的endian样式。没有函数调用 试图寻找这方面的例子很难,因为它们都展示了如何通过轮班来实现 unsigned long address = (((unsigned long) code[l
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;
unsigned long address=(((unsigned long)code[line][1])您可以使用联合。类似于以下内容:
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]
此外,请确保系统的endianness使用此方法。您可以使用union。类似以下内容:
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]
此外,请确保系统的端性使用此方法。您可以使用联合执行此操作。
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];
您可以使用接头执行此操作
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];
在具有小型处理器的嵌入式系统和在项目生命周期内不太可能更改的系统(即编译器、操作系统等)中,生成不可移植代码是有意义的。换句话说,代码可以在此系统上运行,但可能在其他系统上失败
如果您不关心可移植性,只需将code[line][x]
中的字节直接复制到最后一个指针中即可。请注意,这需要使用正确的endianness和正确的指针大小
类似这样的情况(假设指针为4字节,假设code
包含字节):
如果您的系统具有相反的端点,只需从索引1开始,以索引4结束即可
再一次-这是不可移植的代码。在具有小型处理器的嵌入式系统和在项目生命周期内不太可能更改的系统(即编译器、操作系统等)中,生成不可移植的代码是有意义的。换句话说,代码可以在此系统上运行,但可能在其他系统上失败
如果您不关心可移植性,只需将code[line][x]
中的字节直接复制到最后一个指针中即可。请注意,这需要使用正确的endianness和正确的指针大小
类似这样的情况(假设指针为4字节,假设code
包含字节):
如果您的系统具有相反的端点,只需从索引1开始,以索引4结束即可
再一次-这是不可移植的代码。我想我明白了
add = (unsigned int*) (*((unsigned long*) &code[line][1]));
我将指针移到第一个字节并将其转换为长指针…然后将long的值转换为int指针..必须更改我的endian我想我得到了
add = (unsigned int*) (*((unsigned long*) &code[line][1]));
我将指针移到第一个字节,并将其转换为长指针…然后将long的值转换为int指针..必须更改我的endian这是执行这种转换的首选方式。为什么不使用移位?我在微型计算机上..我正在做一些自编程工作,并使用移位调用函数将不可用。必须有一种无移位的方法。如果您不关心可移植代码,并且您知道系统的结尾,您可以使用char*
逐个复制字节。这很难看,但可以工作(在您的特定系统上)我觉得很奇怪,你的索引是从1到4。我希望是0到3。你可以乘以2的适当幂,而不是移位。这是执行这种转换的首选方法。你为什么不想使用移位呢?我在微型计算机上。我正在做一些自编程的事情,使用移位调用函数,而这些函数是不需要的可用..必须有一种无移位的方法..如果你不关心可移植代码,并且知道系统的结尾,你可以使用char*
逐个复制字节,这很难看,但可以工作(在你的特定系统上)我觉得很奇怪,你的索引从1到4运行。我希望从0到3。你可以乘以2的适当幂,而不是移位。它在msp430上工作。可移植性不是一个问题。它可能在你的特定系统上工作,但违反了严格的别名规则,也就是说,意外的编译器优化可能会破坏你的代码此调用这是一种未定义的行为。我一分钱也不下注(美元或欧元)在这方面工作可靠。使用移位和现代编译器,例如gcc。它在msp430上工作。可移植性不是一个问题。它可能在您的特定系统上工作,但违反了严格的别名规则,即意外的编译器优化可能会破坏您的代码。这会调用未定义的行为。我不会赌一分钱(美元或欧元)在这方面工作可靠。使用移位和现代编译器,例如gcc。你知道OP使用MSP430吗?你的代码调用未定义的行为有两个原因!@Olaf-不,我没有看到问题中提到的MSP430。顺便说一句-请解释UBOne的两个原因,UBOne是在arch中建立的,并且你一方的假设是错误的。另一个原因是违反有效的类型规则。请参阅标准。编译器应该出于充分的理由对代码发出警告。@Olaf-谢谢,非常有用。您知道OP使用MSP430吗?您的代码调用未定义的行为有两个原因!@Olaf-不,我没有看到问题中提到的MSP430。顺便说一句-请解释UBOne在arch和wr中的两个原因您的假设是错误的。另一个是违反有效类型规则。请参阅标准。编译器应该有充分的理由警告代码。@Olaf-谢谢,非常有用。您知道OP使用MSP430吗?您的代码调用未定义的行为!@O