标签:
最近在搞毕业设计,做的是有关语音识别的手机应用。在处理音频的过程中,发现需要用short数组处理音频,可能光用byte会越界。但是java读文件没有一次性读到short数组中的api,要么是一个一个读short,要么读到byte数组后人工转为short数组。前者的行为和c++行为正好相反,主要是高低位问题,所以只能采取后者。
见代码:
publicshort[] byteArray2ShortArray(byte[] data, int items) {
short[] retVal =newshort[items];
for (int i =0; i < retVal.length; i++)
retVal[i] = (short) ((data[i *2]&0xff) | (data[i *2+1]&0xff) <<8);
return retVal;
}
虽然如今代码执行是对的,但是注意的是,data元素取出来后要先和0xff按位与一下,否则出来的结果又三分之一不到都是不对的。具体什么原因,请大神给予指点!
data元素取出来后要先和0xff按位与一下,否则出来的结果又三分之一不到都是不对的。
##不熟悉JAVA,估计原因是这样的
Byte在执行位操作时,会隐式转换为带符号的Int类型,于是
首位是0的,值不变(0x7E => 0x0000007E)
首位是1的,值会变化(0xD3 => 0xFFFFFFD3)
如果直接拿首位是1的去进行位或操作,结果就会有问题
如果先执行一次&0xff,那么0xFFFFFFXX就会变为0x000000XX,保证结果的正确
标签:
原文地址:http://www.cnblogs.com/wikiki/p/5340920.html