Android Java中如何将16位有符号整数数组转为字节数组?
Android Java:16位有符号整数序列的编码实现(用于解码算法验证)
在Android Java开发场景中,我们需要验证一段通过for循环拼接字节对解码16位有符号整数序列的算法正确性。测试时需要先将整数列表编码为字节数组(仅测试阶段可使用ByteBuffer等可靠工具,实际场景字节数组由AudioRecord生成),以下是完整实现方案:
需求说明
给定整数列表,编码后的字节数组需满足:每个16位有符号整数拆分为两个字节,高8位在前,低8位在后(对应解码逻辑中的a<<8 | b&0xFF,其中a是高8位字节,b是低8位字节)。
完整代码实现
import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; // 你的方法所在类中 void _go() { int[] source = {4536, -1, -32768, 32767, 0, -2222}; // 你给出的预期编码是正确的,符合高8位在前的字节顺序 byte[] expectedEncoding = {17,4,-1,-1,-128,0,-128,1,0,0,-9,82}; // --- 编码部分实现(两种方案可选)--- // 方案1:使用ByteBuffer(测试阶段推荐,简洁可靠) byte[] encoded; ByteBuffer buffer = ByteBuffer.allocate(source.length * 2); // 设置字节序为大端(对应解码逻辑的高8位在前) buffer.order(ByteOrder.BIG_ENDIAN); for (int num : source) { // 转成short确保是16位有符号整数,匹配AudioRecord采样格式 buffer.putShort((short) num); } encoded = buffer.array(); // 方案2:手动位运算(模拟底层逻辑,可选) /* byte[] encoded = new byte[source.length * 2]; for (int i = 0; i < source.length; i++) { short s = (short) source[i]; // 取高8位,自动截断为byte类型 encoded[2*i] = (byte) (s >> 8); // 取低8位,用&0xFF确保无符号转换 encoded[2*i + 1] = (byte) (s & 0xFF); } */ // 修复原解码代码的bug:原逻辑会重复读取字节,修正为按索引步进2取字节对 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 << 8 | b & 0xFF); } // 用Arrays.toString打印数组内容,避免输出内存地址 Log.i("XXX", "decoded values: " + Arrays.toString(decoded)); }
关键说明
- 原解码代码bug修复:原代码循环取字节时用
encoded[i]和encoded[i+1],会导致字节重复读取(如i=0取0、1,i=1取1、2),修正为encoded[i*2]和encoded[i*2+1]才能正确获取每一对独立字节。 - 字节序匹配:解码逻辑是高8位左移拼接低8位,因此编码必须保证高8位字节在前,对应ByteBuffer的
BIG_ENDIAN字节序。 - 类型转换注意:将int转short时会自动截断为16位,严格符合16位有符号整数的范围(-32768~32767),和AudioRecord的采样数据格式一致。
内容的提问来源于stack exchange,提问作者Nerdy Bunz
相关产品推荐
相关产品推荐

