嘿,我想知道在C语言中如何将整数数组转换为字节数组,声明方法是什么。如果可以更简单,并且不使用指针,我会非常感激。谢谢评论。
示例:int addr [500] 转换为 byte[]
另外,我还希望最终的字节数组具有相同的数组名称。
如果你想要把 int 数组的内存重新解释为字节数组,那么只需要:
int ints[500];
char *bytes = (char *) ints;
如果您想要重新解释现有的内存,那么您必须使用指针强制转换,因为声明一个[]
数组意味着在堆栈上分配内存,并且不能用于重新解释现有的内存。
显然,您需要知道自己在做什么。对于每个int
,通常会有4个char
(具体取决于平台等),因此您的新数组将具有500*4
个元素。请查看以下输出:
printf("char size: %d, int size: %d", sizeof(char), sizeof(int));
如果你尝试将每个int
解释为char
,即获得与int
数量相同的char
,那么你不能不经过循环和手动转换(通常是到新的内存位置)实现这一点。
T *ptr
,那么你可以将其强制转换为(unsigned char *) ptr
并逐字节读取值。C标准规定,除了unsigned char
之外的每种其他类型的行为都是未定义的。例如,没有严格符合规范的程序可以执行*(unsigned short *) ptr
,但是严格符合规范的程序可以执行*(unsigned char *) ptr
。还保证您可以使用memcpy
将对象复制到unsigned char
数组中,然后再复制回来而不会破坏它。请参见n1256 6.2.6.1。 - Dietrich Eppunion {
int ints[500];
char bytes[0];
} addr;
如果你想要:
int
数组背后的内存重新解释为字节,int
数组是可以接受的,那么你可以创建一个新的 char
数组,并使用 memcpy
复制 int
数组:
int ints[500];
char bytes[500 * 4];
memcpy(bytes, ints, 500 * 4);
这与我原始答案中的第一个片段基本相同,不同之处在于 bytes
包含了 ints
的一个 副本(即修改其中一个不会影响另一个)。通常的注意事项包括 int
大小和避免使用魔法常量/重构代码。
使用指针可能更容易,但如果不使用指针,请尝试以下方法:
#include <stdio.h>
typedef unsigned char byte;
void main() {
int addr_size = 500;
int addr[ addr_size ];
byte bytes[ addr_size * 4 ];
int i;
for( i = 0; i < addr_size; i++ ) {
bytes[ i ] = (byte)( addr[ i ] >> 24);
bytes[ i + 1 ] = (byte)( addr[ i ] >> 16);
bytes[ i + 2 ] = (byte)( addr[ i ] >> 8);
bytes[ i + 3 ] = (byte)addr[ i ];
}
}
char[2000]
还是其他什么?您知道小端和大端之间的区别吗? - Vyktor