Java ByteArray在C或C ++中的等价物

时间:2013-04-19 10:03:59

标签: java c++ c byte bytearray

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?

4 个答案:

答案 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 charunsigned char,但我发现它更明确地表示代码正在处理字节。 int8_tsigned 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);