java到C/C++(碳化物C/C++)的转换

java to C/C++(carbide c/c++) converstion

本文关键字:C++ 转换 碳化物 java      更新时间:2023-10-16

在Java中:

值=1122;

public static final byte[] intToByteArray(int value) {
        return new byte[] {
                (byte)(value >>> 24),
                (byte)(value >>> 16),
                (byte)(value >>> 8),
                (byte)value};
    }
  public static int byteArrayToInt(byte[] data) {
        return (int)(
                (int)(0xff & data[0]) << 24  |
                (int)(0xff & data[1]) << 16  |
                (int)(0xff & data[2]) << 8   |
                (int)(0xff & data[3]) << 0
        );
    }

在这里它将返回[0,0,4,98],所以在C:

char* intToByteArray(int value){
        char* temp = new char[4];
         temp[0] = value >> 24,
         temp[1] = value >> 16,
         temp[2] = value >> 8, 
         temp[3] = value;
         return temp;
} 

由于c中没有字节数据类型,我们可以使用char*来代替它,但当我返回temp值时,我会得到null,所以我检查了这样的值,其中=b\x04'b'=98,x04=4我无法得到零数据,所以在转换回时,我应该如何管理剩余值??

         char* where = new char[10];
         where[0] = temp[3];
         where[1] = temp[2];
         where[2] = temp[1];
         where[3] = temp[0];
         where[4] = 0;

我的为空

不,你不是。您得到的第一个字节是 nul字节。当您将其打印为文本字符串时,它将终止该字符串。但它不是一个字符串,而是一个字节数组。

如果你得到一个NULL,你会得到一个分段错误或类似的错误。

虽然上面的文章是绝对正确的,但您的移植工作还有一个更严重的问题。您的java生成

[ 0, 0, 4, 98 ]

而你的C产生

[ 98, 4, 0, 0 ]

如果像那样简单地转换,代码将无法工作。不管硬件是什么,Java都是大端序,但您的C(++)毫无疑问是低端序。更糟糕的是,你不能确定每次都会是这样。有了Carbide,我想你完全可以偶然发现一个big-endian架构(一些ARM?不是这个领域的专家)。因此,您必须检测您的Carbide平台的端序,或者用增量模256替换位移。取决于调用函数的频率。Modulo将认真对待更多的处理器工作,但不关心端序。