byte数组转float实现与byte转换其它类型时进行&运算原理

下面是将byte数组转换为float的实现

    public static float getFloat(byte[] b) {
        int accum = 0;
        accum = accum|(b[0] & 0xff) << 0;
        accum = accum|(b[1] & 0xff) << 8;
        accum = accum|(b[2] & 0xff) << 16;
        accum = accum|(b[3] & 0xff) << 24;
        System.out.println(accum);
        return Float.intBitsToFloat(accum);
    }

注:上面的byte数组转float的实现,其实就是C#中的BitConvetor.toSingle();方法!

byte转换其它类型时进行&运算原理:

在剖析该问题前请看如下代码

    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了,结果就对了。

byte数组转float实现与byte转换其它类型时进行&运算原理

时间: 2024-12-02 13:41:44

byte数组转float实现与byte转换其它类型时进行&运算原理的相关文章

byte数组转float 以及byte转其他类型时为什么要&amp;0xff

static final char[] HEX_CHARS = "0123456789abcdef".toCharArray(); //转换为十六进制 public static String toHexString(byte[] b ) { StringBuilder sb = new StringBuilder(b.length << 2); for (byte x : b) { //byte只有8位 int 则是32位 x& oxff之后会转换为int类型 i

android中的byte数组转换

/** * 将一个单字节的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 byteToH

C# 对象、文件与二进制串(byte数组)之间的转换

1.关于本文 在使用C#下的TCP(类TcpClient).UDP(类UdpClient)协议传输信息时,都需要将信息转换为byte类型的数组进行发送.本文实现了两种object与byte数组的转换和一种文件与byte数组转换的方式.基础类型的数据,可以用BitConverter类中的函数进行转换. 2.object与byte[]的相互转换:使用IFormatter的Serialize和Deserialize进行序列化与反序列化 实现这个功能,需要先引用三个命名空间:System.IO.Syst

[Java] java byte数组与int,long,short,byte转换

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 *            byt

byte数组与int,long,short,byte转换 (转载)

byte数组和short数组转换 public short bytesToShort(byte[] bytes) { return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort(); } public byte[] shortToBytes(short value) { return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(valu

byte[]数组和int之间的转换(转)

本帖转自:h t t p://blog.csdn.net/sunnyfans/article/details/8286906 1.int与byte[]之间的转换(类似的byte short,long型) 1 /** 2 * 将int数值转换为占四个字节的byte数组,本方法适用于(低位在前,高位在后)的顺序. 和bytesToInt()配套使用 3 * @param value 4 * 要转换的int值 5 * @return byte数组 6 */ 7 public static byte[]

byte数组与对象之间的相互转换

在进行网络通信时可能需要传输对象,如果用NIO的话,只能用Bytebuffer和channel直接 通过ByteArray*Stream和Object*Stream可以将byte数组和对象进行相互的转换. 1.byte数组转对象: byte [] data=initData();//初始化byte数组 ByteArrayInputStream inputStream=new ByteArrayInputStream(data); ObjectInputStream oInputStream=ne

byte[]数组与16进制字符串的相互转换

1.将byte[]数组转换成16进制字符 /** * 将byte[]数组转换成16进制字符.一个byte生成两个字符,长度对应1:2 * @param bytes,输入byte[]数组 * @return 16进制字符 */ public static String byte2Hex(byte[] bytes) { if (bytes == null) { return null; } StringBuilder builder = new StringBuilder(); // 遍历byte[

【转】byte[]数组比较(内容比较)--不错

原文网址:http://amanda.blog.51cto.com/7238262/1215118 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://amanda.blog.51cto.com/7238262/1215118 两个数组之间的比较(比较两个数组的内容): 方法一: 直接调用java API 进行比较 1:将byte[]数组转换为String(前提:byte[]数组b1  b2不为空) 2:调用equals()方法比