假设在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());
}
3条答案
按热度按时间nnvyjq4y1#
下面是一个示例,说明如何在Java中将16位有符号整数数组转换为字节数组:
}
这里我们首先创建一个ByteBuffer,其长度为源数组的长度 * 2,因为每个int都是16位长。然后我们使用asShortBuffer()方法创建一个ShortBuffer,这样我们就可以使用put()方法将int数组插入其中。使用byteBuffer的array()方法,我们可以得到字节数组。
然后我们循环遍历encoded字节数组,一次提取两个字节,将第一个字节左移8位,并添加第二个字节,然后将结果转换为short并存储在decoded数组中。
最后,我们记录解码的数组以检查操作是否成功。
请注意,这只是一个示例,您可能需要根据算法的具体要求进行调整。
von4xj4u2#
在Java中,可以使用以下步骤将16位有符号整数数组转换为字节数组:
下面是一个示例实现:
注意:这种转换也被称为序列化和反序列化,可以由不同的库完成,如Avro、Thrift等。
cbeh67ev3#
这里有一个例子...