是的,它们大致相等。Java 当然会存储数组的长度并对每个数组引用进行边界检查。C/C++ 不会,至少在没有额外工作的情况下不会。
在处理 C 中的数字字节值时,我倾向于使用int8_t
and (包括获取 typedef)(有关更多信息,请参见http://www.cplusplus.com/reference/cstdint/)。它等同于and ,但我发现代码正在处理字节更明确。两者和都等价于 Java,因为 Java 中的所有数值都是有符号的。uint8_t
<stdint.h>
signed char
unsigned char
int8_t
signed char
byte
只有当您想将多字节值写入数组时,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);