关于little endian和big endian的问题

关于little endian和big endian的问题

导入:是因为一个小 demo中,录音一段内容传到后台播放都是嘈杂音,所引发的问题和学习

笼统的解释是:CPU处理器存储数据的字节顺序,分为little endian 和 big endian
以下来详细的学习:
- 首先来学习一下:

1、高/低地址端:

栈底      栈       栈顶
高地址端        低地址端

2、高/低位字节

在十进制中:左边是高位,右边是低位,其他进制也一样

例如:0x123678 由高到低的次序为 0x12 0x36 0x78

3、字节序

即字节的顺序,也就是说大于一个字节类型的数据在内存中的存放顺序
通常分为两种:大端字节序和小端字节序

little endian:低位字节摆放在内存地址的低地址端,高位字节摆放在内存地址的高地址端
big endian:高位字节摆放在内存地址的低地址端,低位字节摆放在内存地址的高地址端
网络字节序,即TCP/IP各层协议采用的是big endian,还有其他字节序,比如middle endian等

下面来看一下不同字节序的存放位置:int i = 0x1234
(int类型四个字节,用buf[4] 表示内存地址)

低地址端栈顶栈底高地址端
little endianbuf[0]buf[1]buf[2]buf[3]
0x40x30x20x1
big endianbuf[0]buf[1]buf[2]buf[3]
0x10x20x30x4

知道了如何存放,就该学习一下,两种不同存放方式,怎么转换呢?
例如1:

short[] buffer = new short[bufferSize];
while (isRecording) {
         int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
         for (int i = 0; i < bufferReadResult; i++) {
         dos.writeShort(Short.reverseBytes(buffer[i])); //由big endian转little endian
         }
        dos.write(buffer,0,bufferReadResult);
}

例如2:

InputStream inputStream = new FileInputStream(file);
            byte[] buf = new byte[(int) file.length()];
            inputStream.read(buf);
            inputStream.close();
            short[] bufshort = toShortArray(buf);  //先将byte[] 转成short[],因为录音存的short
            byte[] bufbyte = new byte[buf.length]; //新建byte[],存储转化后的字节
            ByteBuffer byteBuffer = ByteBuffer.wrap(bufbyte).order(ByteOrder.LITTLE_ENDIAN); //利用ByteBuffer转化
            for (int i = 0; i <bufshort.length ; i++) {
                byteBuffer.putShort(bufshort[i]); //将每一个short经过byteBuffer处理
            }
    //对处理后的字节数组编码生成字符串
            return Base64.encodeToString(bufbyte, Base64.NO_WRAP);

参考:
https://stackoverflow.com/questions/4398731/java-little-endian-order

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值