JAVA 字节顺序转换
来源:互联网 发布:vs2017如何编写c语言 编辑:程序博客网 时间:2024/05/22 10:54
- /**
- * 通信格式转换
- *
- * 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;
- }
扩展:
- /**
- * 将double转为低字节在前,高字节在后的byte数组
- * @param n double
- * @return byte[]
- */
- public static byte[] toLH(double n) {
long raw = Double.doubleToRawLongBits(n);
int h = (int)(raw >> 32);
int l = (int)(raw & 0x00000000FFFFFFFF);
byte[] hb = toLH(h);
byte[] lb = toLH(l);
byte[] res = new byte[8];
System.arraycopy(hb, 0, res, 4, 4);
System.arraycopy(lb, 0, res, 0, 4);
return res;
}
byte[]数组转为Double
- static double ArryToDouble(byte[] Array,int Pos)
{
long accum = 0;
accum = Array[Pos+0] & 0xFF;
accum |= (long)(Array[Pos+1] & 0xFF)<<8;
accum |= (long)(Array[Pos+2] & 0xFF)<<16;
accum |= (long)(Array[Pos+3] & 0xFF)<<24;
accum |= (long)(Array[Pos+4] & 0xFF)<<32;
accum |= (long)(Array[Pos+5] & 0xFF)<<40;
accum |= (long)(Array[Pos+6] & 0xFF)<<48;
accum |= (long)(Array[Pos+7] & 0xFF)<<56;
return Double.longBitsToDouble(accum);
- }
- byte[]转为float
- static float ArryToFloat(byte[] Array,int Pos)
{
int accum = 0;
accum = Array[Pos+0] & 0xFF;
accum |= (long)(Array[Pos+1] & 0xFF)<<8;
accum |= (long)(Array[Pos+2] & 0xFF)<<16;
accum |= (long)(Array[Pos+3] & 0xFF)<<24;
return Float.intBitsToFloat(accum);
}
- public static int bytesToInt(byte[] src, int offset) {
int value;
value = (int) ((src[offset] & 0xFF)
| ((src[offset+1] & 0xFF)<<8)
| ((src[offset+2] & 0xFF)<<16)
| ((src[offset+3] & 0xFF)<<24));
return value;
}
- float转换为byte[]
- static byte[] FloatToArray(float Value)
{
int accum = Float.floatToRawIntBits(Value);
byte[] byteRet = new byte[4];
byteRet[0] = (byte)(accum & 0xFF);
byteRet[1] = (byte)((accum>>8) & 0xFF);
byteRet[2] = (byte)((accum>>16) & 0xFF);
byteRet[3] = (byte)((accum>>24) & 0xFF);
return byteRet;
}
转自:http://origin100.iteye.com/blog/267165
0 0
- JAVA 字节顺序转换
- 网络字节顺序转换
- 大小字节顺序转换
- 大小字节顺序转换
- 字节顺序转换函数
- 字节顺序意义及转换
- 本机字节顺序与网络字节顺序的转换
- 网络字节顺序和主机字节顺序的转换
- Java字节序转换
- Java字节序转换
- Java字节码进制转换
- JAVA字节转换
- 【Java】对象、字节转换
- Socket之字节顺序转换函数
- Linux下网络IP地址的转换,主机字节顺序和网络字节顺序的转换。
- 网络IP地址转换、主机字节顺序、网络字节顺序的转换 -- linux
- JAVA文件字节单位转换
- JAVA文件字节单位转换
- 【转】C# TabConTrol控件背景颜色问题
- maven打包时出现编码GBK的不可映射字符
- 巧用Drawable 实现Android UI 元素间距效果
- 使用 Optim 在 Bluemix 应用程序中建立数据隐私保护
- js中的逻辑与(&&)操作
- JAVA 字节顺序转换
- Hadoop 2.0中Capacity Scheduler与Fair Scheduler对比
- 循环-08. 二分法求多项式单根(20)
- ppt怎么转换成pdf方法介绍
- linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York
- 要养成习惯懒加载数据
- 遇到的问题
- <java与模块>第三章面向对象设计原则笔记
- Repository