2

C,C ++中java字节的等价物是什么

byte[]  itemsArray;
itemsArray = new byte[items *no];
itemsArray[x] = (byte) xyz;

unsigned char * itemsArray;
itemsArray = (unsigned char*) malloc (items*no);

如何在 C++ 中使用字节序将字节分配给itemsArray(如 itemsArray[x] = (byte) xyz)以确保正确的字节顺序。

以上内容是否等同于 C 中的 byteArray ?

4

4 回答 4

3

用于memcpy()C.

于 2013-04-19T10:15:37.827 回答
3

signed char相当于大多数平台上的 Java 字节 - C/C++ 标准实际上并不需要这个,但是除了最晦涩的平台/编译器之外,您可以依赖 8 位的字符。char,无论符号如何,都对应于大多数平台上的最小可寻址单元,因此您根本不必担心字节顺序。

您可以像分配给任何其他数组一样分配给该数组 - 在您的示例itemsArray[x] = (unsigned char) xyz中。但是请注意,Java 的字节是有符号的——我不确定您是否打算unsigned在其中使用。如评论中所述,如果您使用数组存储二进制数据,则确实习惯使用unsigned char.

于 2013-04-19T10:32:32.673 回答
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];
于 2013-04-19T10:29:36.430 回答
1

是的,它们大致相等。Java 当然会存储数组的长度并对每个数组引用进行边界检查。C/C++ 不会,至少在没有额外工作的情况下不会。

在处理 C 中的数字字节值时,我倾向于使用int8_tand (包括获取 typedef)(有关更多信息,请参见http://www.cplusplus.com/reference/cstdint/)。它等同于and ,但我发现代码正在处理字节更明确。两者和都等价于 Java,因为 Java 中的所有数值都是有符号的。uint8_t<stdint.h>signed charunsigned charint8_tsigned charbyte

只有当您想将多字节值写入数组时,Big/little-endian 才会发挥作用。如果您想安全起见,请遵循您在 Java 中使用的相同模式。例如

/* 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)您指出的字节序问题(可解决htonl除非您不切换字节序,否则请参阅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);  
于 2013-04-19T17:17:37.130 回答