IEEE754转换类
package com.example.d23.utils;
import android.annotation.SuppressLint;
/**
* Author:Think
* Time:2021/2/3 16:58
* Description:This is IEEE754
*/
public class IEEE754 {
/**
* @Desc: IEEE754标准(四字节转浮点数),公式转换
* @Author: Aries.hu
* @Date: 2021/2/3 10:14
*/
public static float hex2FloatIeee(byte[] hex){
String hexStr = DataTransform.bytesToHex(hex);
StringBuilder binaryStr = new StringBuilder();
for(int i=0;i< hexStr.length();i+=2){
String a = hexStr.substring(i,i+2);
int c = Integer.parseInt(a,16);
@SuppressLint("DefaultLocale") String item = String.format("%08d",Integer.parseInt(Integer.toBinaryString(c)));
binaryStr.append(item);
}
int n = Integer.parseInt(binaryStr.substring(1,9),2);
String mStr = binaryStr.substring(9,binaryStr.length()-1);
double sum = 0;
for(int i =1;i<=mStr.length();i++){
if(mStr.charAt(i-1)=='1'){
sum = sum+Math.pow(0.5,i);
}
}
float v = (float) ((Math.pow(2, n - 127)) * (1 + sum));
return v;
}
/**
* @Desc: IEEE754标准(四字节转浮点数)调用JDK接口转换
* @Author: Aries.hu
* @Date: 2021/2/5 10:23
*/
public static float hex2floatIeeeApi(byte[] bytes, boolean reverse){
if(reverse){
bytes = DataTransform.bytesArrayReverse(bytes);
}
String hex= DataTransform.encodeHexStr(bytes, true);
return Float.intBitsToFloat(Integer.valueOf(hex, 16));
}
/**
* @Desc: IEEE754标准(浮点数转四字节)调用JDK接口转换
* @Author: Aries.hu
* @Date: 2021/2/5 11:57
*/
public static byte[] float2hexIeeeApi(float f){
int intBits = Float.floatToRawIntBits(f);
return DataTransform.intToByteArray(intBits);
}
}
数据转换类
package com.example.d23.utils;
/**
* Author:Think
* Time:2021/2/3 10:14
* Description:This is DataTransfor
*/
public class DataTransform {
//https://www.iteye.com/blog/aub-1129228
//https://github.com/FirebirdSQL/decimal-java
/**
* 用于建立十六进制字符的输出的小写字符数组
*/
private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/**
* 用于建立十六进制字符的输出的大写字符数组
*/
private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
/**
* @Desc: 字节转十六进制字符串
* @Author: Aries.hu
* @Date: 2021/2/3 11:19
*/
public static String byteToHex(byte b) {
String hex = Integer.toHexString(b & 0xFF);
if (hex.length() < 2) {
hex = "0" + hex;
}
return hex;
}
/**
* @Desc: 字节数组转字符串
* @Author: Aries.hu
* @Date: 2021/2/3 11:19
*/
public static String bytesToHex(byte[] bytes) {
StringBuilder sbuffer = new StringBuilder();
for (byte aByte : bytes) {
String hex = Integer.toHexString(aByte & 0xFF);
if (hex.length() < 2) {
sbuffer.append(0);
}
sbuffer.append(hex);
}
return sbuffer.toString();
}
/**
* @Desc: 数组倒序
* @Author: Aries.hu
* @Date: 2021/2/3 15:15
*/
public static byte[] bytesArrayReverse(byte[] src){
byte temp = 0;
int len = src.length;
for (int i = 0; i < len / 2; i++) {
temp = src[i];
src[i] = src[len - i - 1];
src[len - i - 1] = temp;
}
return src;
}
/**
* @Desc: byte数组转换为二进制字符串,每个字节以","隔开
* @Author: Aries.hu
* @Date: 2021/2/3 15:47
*/
public static String byteArrToBinStr(byte[] b) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < b.length; i++) {
result.append(Long.toString(b[i] & 0xff, 2) + ",");
}
return result.toString().substring(0, result.length() - 1);
}
/**
* @Desc: 二进制字符串转换为byte数组,8位一个字节
* @Author: Aries.hu
* @Date: 2021/2/3 15:48
*/
public static byte[] binStrToByteArr(String binStr) {
if("".equals(binStr)){
return new byte[0];
}
final int bits = 8;
int str_len = 0;
int byte_len = 0;
StringBuilder binStrBuilder = new StringBuilder(binStr);
while (binStrBuilder.length() < 32){
binStrBuilder.append("0");
}
binStr = binStrBuilder.toString();
str_len = binStr.length();
System.out.println(binStr);
if(str_len % bits == 0){
byte_len = str_len / bits;
}
byte[] b = new byte[byte_len];
int index = 0;
for(int i=0;i
String s = binStr.substring(i, i+bits);
System.out.println(s);
b[index] = bit2byte(s);
index++;
}
return b;
}
protected static String encodeHexStr(byte[] data, char[] toDigits) {
return new String(encodeHex(data, toDigits));
}
/**
* @Desc: 字节数组转十六进制字符串
* @Author: Aries.hu
* @Date: 2021/2/5 11:48
*/
public static String encodeHexStr(byte[] data, boolean toLowerCase) {
return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
}
/**
* @Desc: 将字节数组转换为十六进制字符数组
* @Author: Aries.hu
* @Date: 2021/2/5 11:47
*/
protected static char[] encodeHex(byte[] data, char[] toDigits) {
int l = data.length;
char[] out = new char[l << 1];
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
return out;
}
public static byte bit2byte(String bString){
byte result=0;
for(int i=bString.length()-1,j=0;i>=0;i--,j++){
result+=(Byte.parseByte(bString.charAt(i)+"")*Math.pow(2, j));
}
return result;
}
/**
* @Desc: 字节数组转二进制字符串
* @Author: Aries.hu
* @Date: 2021/2/3 10:24
*/
public static String bytes2BinaryStr(byte[] bytes){
StringBuilder binaryStr = new StringBuilder();
for (byte aByte : bytes) {
String str = Integer.toBinaryString((aByte & 0xFF) + 0x100).substring(1);
binaryStr.append(str);
}
return binaryStr.toString();
}
/**
* @Desc: int转byte数组
* @Author: Aries.hu
* @Date: 2021/2/5 21:21
*/
public static byte[] intToByteArray(int i) {
byte[] result = new byte[4];
// 由高位到低位
result[0] = (byte) ((i >> 24) & 0xFF);
result[1] = (byte) ((i >> 16) & 0xFF);
result[2] = (byte) ((i >> 8) & 0xFF);
result[3] = (byte) (i & 0xFF);
return result;
}
}
调用
package com.example.d23;
import com.example.d23.utils.DataTransform;
import com.example.d23.utils.IEEE754;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Author:Think
* Time:2021/2/3 11:21
* Description:This is DataTransforTest
*/
public class DataTransformTest {
@Test
public void bytesToFloat(){
byte[] bytes = {(byte) 0x7B, (byte) 0x20, (byte) 0xB1, (byte) 0x2C};
float result = IEEE754.hex2floatIeeeApi(bytes, true);
System.out.println(result);
}
@Test
public void floatToBytes(){
float f = 5.0342486E-12f;
byte[] result = IEEE754.float2hexIeeeApi(f);
System.out.println(DataTransform.bytesToHex(result));
}
}