1

在 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* 来代替,但是当我返回临时值时,我得到了 null 所以我检查了这样的值 where = 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;
4

2 回答 2

3

我越来越空

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

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

于 2012-08-06T13:36:55.927 回答
0

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

[ 0, 0, 4, 98 ]

当你的 C 产生

[ 98, 4, 0, 0 ]

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

于 2012-08-06T14:14:41.280 回答