android 如何在Java中将16位有符号整数数组转换为字节数组?

j8yoct9x  于 2023-01-24  发布在  Android
关注(0)|答案(3)|浏览(699)

假设在Android(Java)上,我们有一个字节数组,它表示一个16位有符号整数序列。
我需要能够通过使用for循环和连接每对字节来解码该数组中的值,以便再次检索原始值(请不要建议使用其他方法,如ByteBuffer)。
为了测试我的算法,我想编码和解码一个整型数列表,看看我是否得到相同的数字。
然而,我不知道如何将原始的int型数组编码成字节数组以供测试,我不想简单地颠倒我的算法,因为我不知道它是否工作...我愿意使用ByteBuffer或任何其他已知的好方法来做 * 编码 *,因为它只用于测试/模拟目的--在真实的的应用程序中,字节数组已由Android. AudioRecord编码。

// dec : short : byte a : byte b
    // 4536 : 0001000100000100 : 17 : 4
    // -1 : 1111111111111111 : -1 : -1
    // -32768 : 1000000000000000 : -128 : 0 
    // 32767 : 1000000000000001 : -128 : 1
    // 0 : 0000000000000000 : 0 : 0
    // -2222 : 1111011101010010 : -9 : 82

void _go() {
        
        int[] source = {4536,-1,-32768,32767,0,-2222};

        // is this even correct?
        byte[] expectedEncoding = {17,4,-1,-1,-128,0,-128,1,0,0,-9,82};

        byte[] encoded = ??? // <----- what goes here?

        int[] decoded = new int[source.length];

        // the algorithm I'm testing
        for (int i=0; i < encoded.length/2; i++) {
            byte a = encoded[i];
            byte b = encoded[i+1];

            decoded[i] = (short) (a<<8 | b & 0xFF);

        }

        Log.i("XXX", "decoded values: " + decoded.toString());
        
    }
nnvyjq4y

nnvyjq4y1#

下面是一个示例,说明如何在Java中将16位有符号整数数组转换为字节数组:

void _go() {
int[] source = {-1,0,32767,-32768,123,456,-999};
ByteBuffer byteBuffer = ByteBuffer.allocate(source.length * 2);
ShortBuffer shortBuffer = byteBuffer.asShortBuffer();
shortBuffer.put(source);
byte[] encoded = byteBuffer.array();

int[] decoded = new int[source.length];

for (int i=0; i < encoded.length/2; i++) {
    byte a = encoded[i*2];
    byte b = encoded[i*2 + 1];

    decoded[i] = (short) ((a & 0xff) << 8 | (b & 0xff));
}

Log.i("XXX", "decoded values: " + Arrays.toString(decoded));

}
这里我们首先创建一个ByteBuffer,其长度为源数组的长度 * 2,因为每个int都是16位长。然后我们使用asShortBuffer()方法创建一个ShortBuffer,这样我们就可以使用put()方法将int数组插入其中。使用byteBuffer的array()方法,我们可以得到字节数组。
然后我们循环遍历encoded字节数组,一次提取两个字节,将第一个字节左移8位,并添加第二个字节,然后将结果转换为short并存储在decoded数组中。
最后,我们记录解码的数组以检查操作是否成功。
请注意,这只是一个示例,您可能需要根据算法的具体要求进行调整。

von4xj4u

von4xj4u2#

在Java中,可以使用以下步骤将16位有符号整数数组转换为字节数组:
下面是一个示例实现:

public static byte[] convertToByteArray(short[] shortArray) {
        byte[] byteArray = new byte[shortArray.length * 2];
        ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
        for (short value : shortArray) {
            byteBuffer.putShort(value);
        }
        return byteArray;
    }

注意:这种转换也被称为序列化和反序列化,可以由不同的库完成,如Avro、Thrift等。

cbeh67ev

cbeh67ev3#

这里有一个例子...

short[] arrayOfShorts = {6, 1, 2, 5};
byte[] arrayOfBytes = new byte[shortArray.length * 2];
ByteBuffer.wrap(byteArray)
                 .order(ByteOrder.LITTLE_ENDIAN)
                 .asShortBuffer().put(shortArray);

相关问题