android 数据类型转化工具

public class DataTypeChangeHelper
{
    /**
     * 将一个单字节的byte转换成32位的int
     *
     * @param b byte
     * @return convert result
     */
    public static int unsignedByteToInt(byte b)
    {
        return (int) b & 0xFF;
    }

    /**
     * 将一个单字节的Byte转换成十六进制的数
     *
     * @param b byte
     * @return convert result
     */
    public static String byteToHex(byte b)
    {
        int i = b & 0xFF;
        return Integer.toHexString(i);
    }

    /**
     * 将一个4byte的数组转换成32位的int
     *
     * @param buf bytes buffer
     * @param pos byte[]中开始转换的位置
     * @return convert result
     */
    public static long unsigned4BytesToInt(byte[] buf, int pos)
    {
        int firstByte = 0;
        int secondByte = 0;
        int thirdByte = 0;
        int fourthByte = 0;
        int index = pos;
        firstByte = (0x000000FF & ((int) buf[index]));
        secondByte = (0x000000FF & ((int) buf[index + 1]));
        thirdByte = (0x000000FF & ((int) buf[index + 2]));
        fourthByte = (0x000000FF & ((int) buf[index + 3]));
        index = index + 4;
        return ((long) (firstByte << 24 | secondByte << 16 | thirdByte << 8 | fourthByte)) & 0xFFFFFFFFL;
    }

    /**
     * 将16位的short转换成byte数组
     *
     * @param s short
     * @return byte[] 长度为2
     */
    public static byte[] shortToByteArray(short s)
    {
        byte[] targets = new byte[2];
        for (int i = 0; i < 2; i++)
        {
            int offset = (targets.length - 1 - i) * 8;
            targets[i] = (byte) ((s >>> offset) & 0xff);
        }
        return targets;
    }

    /**
     * 将32位整数转换成长度为4的byte数组
     *
     * @param s int
     * @return byte[]
     */
    public static byte[] intToByteArray(int s)
    {
        byte[] targets = new byte[2];
        for (int i = 0; i < 4; i++)
        {
            int offset = (targets.length - 1 - i) * 8;
            targets[i] = (byte) ((s >>> offset) & 0xff);
        }
        return targets;
    }

    /**
     * long to byte[]
     *
     * @param s long
     * @return byte[]
     */
    public static byte[] longToByteArray(long s)
    {
        byte[] targets = new byte[2];
        for (int i = 0; i < 8; i++)
        {
            int offset = (targets.length - 1 - i) * 8;
            targets[i] = (byte) ((s >>> offset) & 0xff);
        }
        return targets;
    }

    /**
     * 32位int转byte[]
     */
    public static byte[] int2byte(int res)
    {
        byte[] targets = new byte[4];
        targets[0] = (byte) (res & 0xff);// 最低位
        targets[1] = (byte) ((res >> 8) & 0xff);// 次低位
        targets[2] = (byte) ((res >> 16) & 0xff);// 次高位
        targets[3] = (byte) (res >>> 24);// 最高位,无符号右移。
        return targets;
    }

    /**
     * 将长度为2的byte数组转换为16位int
     *
     * @param res byte[]
     * @return int
     */
    public static int byte2int(byte[] res)
    {
        // res = InversionByte(res);
        // 一个byte数据左移24位变成0x??000000,再右移8位变成0x00??0000
        int targets = (res[0] & 0xff) | ((res[1] << 8) & 0xff00); // | 表示安位或
        return targets;
    }

    /**
     * byte数组转short数组   小端储存
     *
     * @param src
     * @return
     */
    public static short[] byteArrayToShortArray(byte[] src)
    {
        int count = src.length >> 1;
        short[] dest = new short[count];
        for (int i = 0; i < count; i++)
        {
            dest[i] = (short) ((src[2 * i + 1] << 8) | (src[2 * i] & 0xff));
        }
        return dest;
    }

    /**
     * short数组转byte数组  小端储存
     *
     * @param src
     * @return
     */
    public static byte[] shortArrayToByteArray(short[] src)
    {

        int count = src.length;
        byte[] dest = new byte[count*2];
        for (int i = 0; i < count; i++)
        {
            dest[i * 2] = (byte) (src[i] & 0xff);
            dest[i * 2 + 1] = (byte) (src[i] >> 8 & 0xff);
        }

        return dest;
    }

    /**
     * short数组转byte数组  小端储存
     *
     * @param src
     * @return
     */
    public static int shortArrayToByteArray(short[] src, byte[] outarry)
    {
        byte[] dest = outarry;
        int count = outarry.length / 2 <= src.length ? outarry.length / 2 : src.length;
        for (int i = 0; i < count; i++)
        {
            dest[i * 2] = (byte) (src[i] & 0xff);
            dest[i * 2 + 1] = (byte) (src[i] >> 8 & 0xff);
        }
        return count * 2;
    }

    /**
     * convert double signals to 16-bit pcm
     *
     * @param d          double signals
     * @param s          16-bit pcm
     * @param numsamples no. of samples to be converted
     */
    public static void double2Short(double[] d, short[] s, int numsamples)
    {
        for (int i = 0; i < numsamples; i++) s[i] = double2Short(d[i]);
    }

    /**
     * convert a double signal sample to 16 bits pcm sample
     *
     * @param d a double sample
     * @return
     */
    public static short double2Short(double d)
    {
        if (d > 1.0)
        {
            d = 1.0;
        }
        else if (d < -1.0)
        {
            d = -1.0;
        }

        return (short) (d * Short.MAX_VALUE);
    }

    /**
     * convert a yuan-byte short sample to double sample
     *
     * @param s 16 bits pcm sample
     * @return
     */
    public static double short2Double(short s)
    {
        return (double) s / Short.MAX_VALUE;
    }

    /**
     * convert yuan-byte short samples to double samples
     *
     * @param s          16-bit samples
     * @param d          double samples
     * @param numsamples no. of samples to be converted
     */
    public static void short2Double(short[] s, double[] d, int numsamples)
    {
        for (int i = 0; i < numsamples; i++) d[i] = short2Double(s[i]);
    }

    /**
     * convert a yuan-byte short sample to float sample
     *
     * @param s 16 bits pcm sample
     * @return
     */
    public static float short2Float(short s)
    {
        return (float) s / Short.MAX_VALUE;
    }

    /**
     * convert 16-bit pcm to float
     *
     * @param s          16-bit pcm data
     * @param f          float data
     * @param numsamples no. of samples to be converted
     */
    public static void short2Float(short[] s, float[] f, int numsamples)
    {
        for (int i = 0; i < numsamples; i++) f[i] = short2Float(s[i]);
    }

    /**
     * convert a float signal sample to 16 bits pcm sample
     *
     * @param f a float sample
     * @return
     */
    public static short float2Short(float f)
    {
        if (f > 1.0)
        {
            f = 1.0f;
        }
        else if (f < -1.0)
        {
            f = -1.0f;
        }

        return (short) (f * Short.MAX_VALUE);
    }

    /**
     * convert float signal to 16-bit pcm
     *
     * @param f          float signal
     * @param s          16-bit pcm
     * @param numsamples no. of samples to be converted
     */
    public static void float2Short(float[] f, short[] s, int numsamples)
    {
        for (int i = 0; i < numsamples; i++) s[i] = float2Short(f[i]);
    }

    /**
     * convert 24-bit pcm signal to souble samples
     *
     * @param orgBuffer
     * 24-bit pcm samples
     * @param outBuffer
     * double samples
     */
    private static boolean isPerGain = false;

    public static void byteArray24_2_doubleArray(byte[] orgBuffer, double[] outBuffer)
    {
        int len = orgBuffer.length / 3 < outBuffer.length ? orgBuffer.length / 3 : outBuffer.length;
        int i0, i1, i2;
        double f;
        int a;
        for (int i = 0; i < len; i++)
        {
            i0 = (int) orgBuffer[3 * i + 0] & 0x000000ff;
            i1 = (int) orgBuffer[3 * i + 1] & 0x000000ff;
            i2 = (int) orgBuffer[3 * i + 2] & 0x000000ff;
            //negative value, pad with 0xff
            if ((i2 & 0x00000080) != 0)
            {
                i2 |= 0xffffff00;
            }
            i0 |= i2 << 16 | i1 << 8;
            /**
             * test
             */
            if (isPerGain)
            {
                a = i % 8;
                if (a >= 4)
                {
                    i0 = i0 << 6;
                }
//            else
//                i0 = 0;
            }

            f = (float) i0 / 16777216;
            if (f < -1.0)
            {
                f = -1.0;
            }
            else if (f > 1.0)
            {
                f = 1.0;
            }

            outBuffer[i] = f;
        }
    }

    public static void byteArray24_2_doubleArray_withPerGain(byte[] orgBuffer, double[] outBuffer)
    {
        isPerGain = true;
        byteArray24_2_doubleArray(orgBuffer, outBuffer);
        isPerGain = false;
    }

    /**
     * convert 32-bit pcm signal to double samples
     *
     * @param orgBuffer 32-bit pcm samples
     * @param outBuffer double samples
     */
    public static void byteArray32_2_doubleArray(byte[] orgBuffer, double[] outBuffer)
    {
        int len = orgBuffer.length / 4 > outBuffer.length ? outBuffer.length : orgBuffer.length / 4;
        int i0, i1, i2, i3;
        double f;
        for (int i = 0; i < len; i++)
        {
            /*
             * merge to int
             */
            i0 = (int) orgBuffer[i * 4 + 0] & 0x000000ff;
            i1 = (int) orgBuffer[i * 4 + 1] & 0x000000ff;
            i2 = (int) orgBuffer[i * 4 + 2] & 0x000000ff;
            i3 = (int) orgBuffer[i * 4 + 3] & 0x000000ff;
            //negative value, pad with 0xff
            if ((i3 & 0x00000080) != 0)
            {
                i3 |= 0xffffff00;
            }
            i0 |= i3 << 24 | i2 << 16 | i1 << 8;

            /*
             * convert to double
             */
            f = (float) i0 / Integer.MAX_VALUE;
            if (f < -1.0)
            {
                f = -1.0;
            }
            else if (f > 1.0)
            {
                f = 1.0;
            }
            outBuffer[i] = f;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容