C或C+中的Java字节数组等价物+; 在C、C++、P/P中,java字节的等价物是什么? byte[] itemsArray; itemsArray = new byte[items *no]; itemsArray[x] = (byte) xyz; unsigned char * itemsArray; itemsArray = (unsigned char*) malloc (items*no); 如何将字节分配给 ItsStase(如C++中的代码> ITESs[x] =(字节)XYZ ),用以保证正确的字节顺序。

C或C+中的Java字节数组等价物+; 在C、C++、P/P中,java字节的等价物是什么? byte[] itemsArray; itemsArray = new byte[items *no]; itemsArray[x] = (byte) xyz; unsigned char * itemsArray; itemsArray = (unsigned char*) malloc (items*no); 如何将字节分配给 ItsStase(如C++中的代码> ITESs[x] =(字节)XYZ ),用以保证正确的字节顺序。,java,c++,c,byte,bytearray,Java,C++,C,Byte,Bytearray,上述内容是否等同于C中的byteArray?使用memcpy()在C中的内存之间复制缓冲区 是的,它们是等价的 我只是想指出,始终初始化变量是一个非常好的主意: unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems); 或 如果你有点偏执: unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems); if(itemsArray ==

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

使用
memcpy()
C
中的内存之间复制缓冲区

是的,它们是等价的

我只是想指出,始终初始化变量是一个非常好的主意:

unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems);

如果你有点偏执:

unsigned char * itemsArray = (unsigned char*) malloc (numberOfItems);
if(itemsArray == NULL) {
    //Error, not enough memory
}
<>和C++中,你应该使用新的/Delphi而不是MalC/Cnc++(注意C++中可以使用MalC/C,但是不要把它们与新的/删除混合)


signed char
在大多数平台上等同于Java字节——C/C++标准实际上并不要求这样做,但除了最晦涩的平台/编译器外,其他平台/编译器上都可以使用8位字符
char
,不管是否有符号,在大多数平台上都对应于最小的可寻址单元,因此您根本不必担心endianness


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

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

在处理C中的数字字节值时,我倾向于使用
int8\u t
uint8\u t
(包括
以获取typedef)(有关更多信息,请参阅)。它相当于
signed char
unsigned char
,但我发现更明确的是,代码是在字节上工作的。
int8\t
signed char
都等同于Java的
byte
,因为Java中的所有数值都是有符号的

只有当您要向数组写入多字节值时,才可以使用大/小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)您指出的endian问题(可使用
htonl
解决,除非您不切换endian,请参见)和(2)存储对齐问题。如果试图存储/读取未对齐的值,在某些系统上会出现总线错误,程序将崩溃

/* only do this if 'i' is a multiple of 4! */
*((uint32_t*)&bytes[i]) = htonl(myint);  

不,那是错的。C和C++确实需要1个字符=1个字节。@ KONRAD:java <代码>字节< /C>(数据类型)总是8位。C/C++中的字节可以有其他大小。@Klas True。但是,C++中的<代码> char < /C> >保证为一个字节的大小。§3.3.5说,
sizeof(char)=1
,并且
sizeof
给出了类型的字节大小。@Jaymer:您应该指出,在处理二进制数据时,
无符号char
是大多数人在C/C++中使用的,因此即使
有符号char
可能更像java byte,<代码>未签名的char <代码>仍然是一个更好的选择。@ Konrad jaymmer正确地指出,C/C++标准不要求<代码> char <代码>正好是8位(java <代码>字节< /COD>(数据类型))。C++中使用
std::vector
。只有当您试图将多字节值写入字节数组时,Endianness才是一个问题;您似乎只是想向数组中写入单个字节。也许您的意思是
xyz
是一个较大的值(可能是大小
no
),您想将其所有字节写入数组吗?此外,C和C++是非常不同的语言;你在问什么?
/* 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);
/* only do this if 'i' is a multiple of 4! */
*((uint32_t*)&bytes[i]) = htonl(myint);