`
snoopy7713
  • 浏览: 1123701 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

byte[]转化成其他数据类型

    博客分类:
  • java
阅读更多

Java与其他语言数据类型之间的转换方法实例程序

/***
 * 通信格式转换** Java和一些windows编程语言如c、c++、Delphi所写的网络程序进行通讯时,需要进行相应的转换* 高、低字
 *
 * 节之间的转换* windows的字节序为低字节开头温馨提示:您正在浏览的是 Java与其他语言数据类型之间的转换方法 的内容,您可
 *
 * 以在下面的搜索框中搜索到更多关于 Java与其他语言数据类型之间的转换方法 的文章。
 *
 * Java与其他语言数据类型之间的转换方法实例程序
 *
 * /*** 通信格式转换** Java和一些windows编程语言如c、c++、Delphi所写的网络程序进行通讯时,需要进行相应的转换* 高、低字
 *
 * 节之间的转换* windows的字节序为低字节开头* Linux,unix的字节序为高字节开头* java则无论平台变化,都是高字节开头
 */
public class FormatTransfer {
    /**
     * * 将int转为低字节在前,高字节在后的byte数组 * @param n int * @return byte[]
     */
    public static byte[] toLH(int n) {
        byte[] b = new byte[4];
        b[0] = (byte) (n & 0xff);
        b[1] = (byte) (n >> 8 &

        0xff);
        b[2] = (byte) (n >> 16 & 0xff);
        b[3] = (byte) (n >> 24 & 0xff);
        return b;
    }

    /** * 将int转为高字节在前,低字节在后的byte数组 * @param n int * @return byte[] */
    public static byte[] toHH(int

    n) {
        byte[] b = new byte[4];
        b[3] = (byte) (n & 0xff);
        b[2] = (byte) (n >> 8 & 0xff);
        b[1] = (byte) (n >> 16 &

        0xff);
        b[0] = (byte) (n >> 24 & 0xff);
        return b;
    }

    /** * 将short转为低字节在前,高字节在后的byte数组 * @param n short * @return byte[] */
    public static byte[] toLH

    (short n) {
        byte[] b = new byte[2];
        b[0] = (byte) (n & 0xff);
        b[1] = (byte) (n >> 8 & 0xff);
        return b;
    }

    /** * 将short转为高字节在前,低字节在后的byte数组 * @param n short * @return byte[] */
    public static byte[] toHH

    (short n) {
        byte[] b = new byte[2];
        b[1] = (byte) (n & 0xff);
        b[0] = (byte) (n >> 8 & 0xff);
        return b;
    }

    /**
     * * 将将int转为高字节在前,低字节在后的byte数组 public static byte[] toHH(int number) { int
     * temp = number; byte[] b = new byte[4]; for (int i = b.length - 1; i >
     *
     * -1; i--) { b = new Integer(temp & 0xff).byteValue(); temp = temp >> 8; }
     * return b;} public static byte[] IntToByteArray(int i) { byte[] abyte0 =
     * new byte[4]; abyte0[3] = (byte) (0xff & i);
     *
     * abyte0[2] = (byte) ((0xff00 & i) >> 8); abyte0[1] = (byte) ((0xff0000 &
     * i) >> 16); abyte0[0] = (byte)
     *
     * ((0xff000000 & i) >> 24); return abyte0;}
     */
    /** * 将float转为低字节在前,高字节在后的byte数组 */
    public static byte[] toLH(float f) {

        return toLH(Float.floatToRawIntBits(f));
    }

    /** * 将float转为高字节在前,低字节在后的byte数组 */
    public static byte[] toHH(float f) {
        return toHH

        (Float.floatToRawIntBits(f));
    }

    /** * 将String转为byte数组 */
    public static byte[] stringToBytes(String s, int length) {
        while (s.getBytes

        ().length < length) {
            s += " ";
        }
        return s.getBytes();
    }

    /** * 将字节数组转换为String * @param b byte[] * @return String */
    public static String bytesToString(byte[] b) {

        StringBuffer result = new StringBuffer("");
        int length = b.length;
        for (int i = 0; i < length; i++) {

            result.append((char) (b & 0xff));
        }
        return result.toString();
    }

    /** * 将字符串转换为byte数组 * @param s String * @return byte[] */
    public static byte[] stringToBytes(String s) {

        return s.getBytes();
    }

    /** * 将高字节数组转换为int * @param b byte[] * @return int */
    public static int hBytesToInt(byte[] b) {
        int s =

        0;
        for (int i = 0; i < 3; i++) {
            if (b >= 0) {
                s = s + b;
            } else {
                s = s + 256 + b;
            }
            s = s *

            256;
        }
        if (b[3] >= 0) {
            s = s + b[3];
        } else {
            s = s + 256 + b[3];
        }
        return s;
    }

    /** * 将低字节数组转换为int * @param b byte[] * @return int */
    public static int lBytesToInt(byte[] b) {
        int s =

        0;
        for (int i = 0; i < 3; i++) {
            if (b[3 - i] >= 0) {
                s = s + b[3 - i];
            } else {
                s = s + 256 + b[3 - i];
            }

            s = s * 256;
        }
        if (b[0] >= 0) {
            s = s + b[0];
        } else {
            s = s + 256 + b[0];
        }
        return s;
    }

    /** * 高字节数组到short的转换 * @param b byte[] * @return short */
    public static short hBytesToShort(byte[] b) {

        int s = 0;
        if (b[0] >= 0) {
            s = s + b[0];
        } else {
            s = s + 256 + b[0];
        }
        s = s * 256;
        if (b[1] >=

        0) {
            s = s + b[1];
        } else {
            s = s + 256 + b[1];
        }
        short result = (short) s;
        return result;
    }

    /** * 低字节数组到short的转换 * @param b byte[] * @return short */
    public static short lBytesToShort(byte[] b) {

        int s = 0;

        if (b[1] >= 0) {
            s = s + b[1];
        } else {
            s = s + 256 + b[1];
        }
        s = s * 256;
        if (b[0] >= 0) {
            s =

            s + b[0];
        } else {
            s = s + 256 + b[0];
        }
        short result = (short) s;
        return result;
    }

    /** * 高字节数组转换为float * @param b byte[] * @return float */
    public static float hBytesToFloat(byte[] b) { 

int i = 0;  Float F = new Float(0.0);  i = ((((b[0]&0xff)<<8 (b[1]&0xff))<<8) (b[2]&0xff))<<8 (b[3]&0xff);  return

F.intBitsToFloat(i);}
    /** * 低字节数组转换为float * @param b byte[] * @return float */
    public static float lBytesToFloat(byte[] b) { 

int i = 0;  Float F = new Float(0.0);  i = ((((b[3]&0xff)<<8 (b[2]&0xff))<<8) (b[1]&0xff))<<8 (b[0]&0xff);  return

F.intBitsToFloat(i);}
    /** * 将byte数组中的元素倒序排列 */
    public static byte[] bytesReverseOrder(byte[] b) {
        int length = b.length;

        byte[] result = new byte[length];
        for (int i = 0; i < length; i++) {
            result[length - i - 1] = b;
        }
        return result;
    }

    /** * 打印byte数组 */
    public static void printBytes(byte[] bb) {
        int length = bb.length;
        for (int i = 0; i < length;

        i++) {
            System.out.print(bb + " ");
        }
        System.out.println("");
    }

    public static void logBytes(byte[] bb) {
        int length = bb.length;
        String out = "";
        for (int i = 0; i < length; i++) {

            out = out + bb + " ";
        }
    }

    /** * 将int类型的值转换为字节序颠倒过来对应的int值 * @param i int * @return int */
    public static int reverseInt

    (int i) {
        int result = FormatTransfer.hBytesToInt(FormatTransfer.toLH(i));
        return result;
    }

    /** * 将short类型的值转换为字节序颠倒过来对应的short值 * @param s short * @return short */
    public static short

    reverseShort(short s) {
        short result = FormatTransfer.hBytesToShort(FormatTransfer.toLH(s));
        return result;
    }

    /** * 将float类型的值转换为字节序颠倒过来对应的float值 * @param f float * @return float */
    public static float

    reverseFloat(float f) {
        float result = FormatTransfer.hBytesToFloat(FormatTransfer.toLH(f));
        return result;
    }
}
























在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
  String ret = "";
  for (int i = 0; i < b.length; i++) {
   String hex = Integer.toHexString(b[ i ] & 0xFF);
   if (hex.length() == 1) {
    hex = '0' + hex;
   }
   ret += hex.toUpperCase();
  }
  return ret;
}
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:
        一个数如果是正,则它的反码与原码相同;
        一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法
       对于十进制数,从9得到5可用减法:
       9-4=5    因为4+6=10,我们可以将6作为4的补数
       改写为加法:
       9+6=15(去掉高位1,也就是减10)得到5.

       对于十六进制数,从c到5可用减法:
       c-7=5    因为7+9=16 将9作为7的补数
       改写为加法:
       c+9=15(去掉高位1,也就是减16)得到5.

    在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

    ⑴一个数为正,则它的原码、反码、补码相同
    ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
   
- 1的原码为                10000001
- 1的反码为                11111110
                                                   + 1
- 1的补码为                11111111

0的原码为                 00000000
0的反码为                 11111111(正零和负零的反码相同)
                                          +1
0的补码为               100000000(舍掉打头的1,正零和负零的补码相同)

Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。

----
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

分享到:
评论

相关推荐

    S7-1200中将BYTE类型数据转换成char类型数据的具体方法.docx

    TIA博途_S7-1200中将BYTE类型的数据转换成char类型的具体方法和注意事项

    数据类型转化的代码java

    这个是执行数据类型转化的代码 在只有byte类型的情况下实现转化 放到applet中可以运行

    基本数据类型包装类.txt

    byte——Byte short——Short int——Integer ...封装了字符串转化成基本数据类型的方法(重点) 常用的字符串转化为基本数据类型的方法: Integer.parseInt() Long.parseLong() Double.parseDouble()

    一个byte数组与字符串转化类库

    2.将字节数组转化为String类型的数据 3.转换一个int为byte数组 4.从字节数组中指定的位置读取一个Integer类型的数据 5.转换一个shor字符串为byte数组 6.从字节数组中指定的位置读取一个Short类型的数据

    php字符串与byte字节数组转化类.zip

    介绍php字符串与byte字节数组转化类,转换一个String字符串为byte数组,将字节数组转化为String类型的数据,转换一个int为byte数组,从字节数组中指定的位置读取一个Integer类型的数据,转换一个shor字符串为byte...

    int类型和byte数组之间的转换

    写一个方法,将int类型转换为字节数组,输入任意int类型整型,输出字节数组;写第二个方法,输入字节数组,输出对应int类型数据。

    byte、十进制、十六进制间的转换

    byte数组、十进制、十六进制间的两两转换

    一个byte数组与字符串转化类库.zip

    将字节数组转化为String类型的数据 3.转换一个int为byte数组 4.从字节数组中指定的位置读取一个Integer类型的数据 5.转换一个shor字符串为byte数组 6.从字节数组中指定的位置读取一个Short...

    16进制与10进制相互转换,整型,双整型,浮点数等

    所以使用程序读出的都是一个16进制字符串,这时就需要自己手动根据数据类型转换成10进制自己需要的数,自已编写的一个小工具,完美实现各种数据类型16进制与10进制之间的转换,包括Byte、Word、DWord、Int、Dint、...

    JAVA8大数据类型.pdf

    低---------------------------------------------&gt;⾼ byte,short,char-&gt; int -&gt; long -&gt; float -&gt; double 运算中,不同类型的数据先转化为同⼀类型,然后进⾏运算,转换规则如下: 基本数据类型的强制转换: 强制...

    Java的基本数据类型和包装类的关系

    但在Java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,Java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了。这些包装类有:Boolean...

    asp 类型转换函数大全第1/2页

    cbyte (expression) 转换成byte数据类型变量。 ccur (expression) 转换成currency数据类型变量。 cdate (expression) 转换成date数据类型变量。 cdbl (expression) 转换成double数据类型变量。 chr(charcode) 把...

    netty 在java中的字节码转换

    netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。

    【DLL,.Net,C#,Unity】键值对数据流存储DLL程序集(点开简介找度盘链接!)

    可以储存int,long,short,byte,double ,float, bool, string, byte[]十种数据,以及将任何类型和对象转化为byte[]数据的公共接口,因此理论上能够储存所有数据类型 代码完全开源在网络供所有人免费下载,压缩包内涵...

    Android中的Bitmap序列化失败的解决方法

    之前写了个User类(实现了...这是因为byte数组和Bitmap之间的可以转化,实现也比较方便。 附byte数组与Bitmap的相互转换方法: Bitmap转换成byte数组 private byte[] bitmap2Bytes(Bitmap bitmap) { ByteArrayOutputS

    LabVIEW,字节数组至数值转换

    LabVIEW程序,功能:将4字节的unsigned char输入组合成1个32-bit int值,若输入字节数不等于4则报错。

    ReadXML.zip

    Unity3d读取XML文件,包括int,string,byte,char,float等数据类型的相互转化,以及tostring方法的使用

    JavaXML解析器FastXml.zip

    当需要把某个属性值或者文本块内容转换为int、short、long时,不需要先把byte数组转化成string,然后再转化成int、short、long。FastXml直接把byte数组转换成对应的类型。 如果xml文档中有些标签内容你并...

    java实现的LSB顺序隐写

    1、读取图片A,获得其RGB三个通道数据并转换成三个矩阵a1,a2,a3。 2、读取文件B,将其转换成比特流b。 3、遍历b,得到比特b1,b2,b3,b4,b5,b6等等,将b1代替a1第一个元素的最低位,将b2代替a2第一个元素的最低位,...

Global site tag (gtag.js) - Google Analytics