C,C ++
中java字节的等价物byte[] itemsArray;
itemsArray = new byte[items *no];
itemsArray[x] = (byte) xyz;
unsigned char * itemsArray;
itemsArray = (unsigned char*) malloc (items*no);
如何在C ++中使用endianess将字节分配给itemsArray
(如itemsArray[x] = (byte) xyz
),以确保正确的字节顺序。
上述内容是否等同于C中的byteArray?
答案 0 :(得分:3)
signed char
等同于Java字节--C / C ++标准实际上并不需要这样,但是除了最模糊的平台/编译器外,你可以依赖于8位字符。 char
,无论签名如何,都对应于大多数平台上最小的可寻址单元,因此您根本不必担心字节序。
在示例itemsArray[x] = (unsigned char) xyz
中,您将像对待任何其他数组一样分配给数组。但请注意,Java的字节已经签名 - 我不确定您是否打算在那里使用unsigned
。如评论中所述,如果您使用数组来存储二进制数据,那么使用unsigned char
确实很习惯。
答案 1 :(得分:2)
使用memcpy()
在C
的内存之间复制缓冲区。
答案 2 :(得分:1)
是的,它们是等价的
我只想指出始终初始化变量是一个非常好的主意:
unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems);
或
unsigned char * itemsArray = NULL;
itemsArray = (unsigned char*) malloc (numberOfItems);
如果你有点偏执:
unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems);
if(itemsArray == NULL) {
//Error, not enough memory
}
在c ++中你应该使用new / delete而不是malloc / free(请注意,在C ++中你可以使用malloc / free,但不要将它们与new / delete混合使用)
unsigned char * itemsArray = new unsigned char[items*no];
答案 3 :(得分:1)
是的,它们大致相同。 Java当然存储数组的长度,并对每个数组引用进行边界检查。 C / C ++没有,至少没有额外的工作。
在处理C中的数字字节值(包括int8_t
以获取typedef)时,我倾向于使用uint8_t
和<stdint.h>
(有关详细信息,请参阅http://www.cplusplus.com/reference/cstdint/)。它相当于signed char
和unsigned char
,但我发现它更明确地表示代码正在处理字节。 int8_t
和signed char
都等同于Java的byte
,因为Java中的所有数值都是有符号的。
当您想要向数组写入多字节值时,Big / little-endian才会起作用。如果您想要在安全方面,请遵循您在Java中使用的相同模式。 E.g。
/* example of storing in big-endian */
bytes[i+0] = (int8_t)(myint >> 24);
bytes[i+1] = (int8_t)(myint >> 16);
bytes[i+2] = (int8_t)(myint >> 8);
bytes[i+3] = (int8_t)(myint);
如果你想避免额外的移位并直接写入字节数组,你可以将字节数组指针转换为int数组并存储,但是你会遇到两个潜在的问题:(1)你指出的字节序问题out(使用htonl
解决,除非您没有切换endians,请参阅http://pubs.opengroup.org/onlinepubs/007908775/xns/htonl.html),以及(2)存储对齐问题。如果您尝试存储/读取未对齐的值,则在某些系统上会出现总线错误,程序将崩溃。
/* only do this if 'i' is a multiple of 4! */
*((uint32_t*)&bytes[i]) = htonl(myint);