在Java的網絡編程中傳輸的常常是byte數組,但咱們實際中使用的數據類型多是任一種數據類型,這就須要在它們之間相互轉換,轉換的核心在於將其餘類型的數據的每一位轉換成byte類型的數據。下面給出相關的轉換代碼java
1.short與byte數組的互轉編程
[java] view plaincopy數組
/** 網絡
* 轉換short爲byte spa
* .net
* @param b orm
* @param s 須要轉換的short blog
* @param index 字符串
*/ get
public static void putShort(byte b[], short s, int index) {
b[index + 1] = (byte) (s >> 8);
b[index + 0] = (byte) (s >> 0);
}
/**
* 經過byte數組取到short
*
* @param b
* @param index 第幾位開始取
* @return
*/
public static short getShort(byte[] b, int index) {
return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
}
2.int與byte數組的互轉
[java] view plaincopy
/**
*將32位的int值放到4字節的byte數組
* @param num
* @return
*/
public static byte[] intToByteArray(int num) {
byte[] result = new byte[4];
result[0] = (byte)(num >>> 24);//取最高8位放到0下標
result[1] = (byte)(num >>> 16);//取次高8爲放到1下標
result[2] = (byte)(num >>> 8); //取次低8位放到2下標
result[3] = (byte)(num ); //取最低8位放到3下標
return result;
}
/**
* 將4字節的byte數組轉成一個int值
* @param b
* @return
*/
public static int byteArrayToInt(byte[] b){
byte[] a = new byte[4];
int i = a.length - 1,j = b.length - 1;
for (; i >= 0 ; i--,j--) {//從b的尾部(即int值的低位)開始copy數據
if(j >= 0)
a[i] = b[j];
else
a[i] = 0;//若是b.length不足4,則將高位補0
}
int v0 = (a[0] & 0xff) << 24;//&0xff將byte值無差別轉成int,避免Java自動類型提高後,會保留高位的符號位
int v1 = (a[1] & 0xff) << 16;
int v2 = (a[2] & 0xff) << 8;
int v3 = (a[3] & 0xff) ;
return v0 + v1 + v2 + v3;
}
3.long與byte數組的互轉
[java] view plaincopy
/**
* 將64位的long值放到8字節的byte數組
* @param num
* @return 返回轉換後的byte數組
*/
public static byte[] longToByteArray(long num) {
byte[] result = new byte[8];
result[0] = (byte) (num >>> 56);// 取最高8位放到0下標
result[1] = (byte) (num >>> 48);// 取最高8位放到0下標
result[2] = (byte) (num >>> 40);// 取最高8位放到0下標
result[3] = (byte) (num >>> 32);// 取最高8位放到0下標
result[4] = (byte) (num >>> 24);// 取最高8位放到0下標
result[5] = (byte) (num >>> 16);// 取次高8爲放到1下標
result[6] = (byte) (num >>> 8); // 取次低8位放到2下標
result[7] = (byte) (num); // 取最低8位放到3下標
return result;
}
/**
* 將8字節的byte數組轉成一個long值
* @param byteArray
* @return 轉換後的long型數值
*/
public static long byteArrayToInt(byte[] byteArray) {
byte[] a = new byte[8];
int i = a.length - 1, j = byteArray.length - 1;
for (; i >= 0; i--, j--) {// 從b的尾部(即int值的低位)開始copy數據
if (j >= 0)
a[i] = byteArray[j];
else
a[i] = 0;// 若是b.length不足4,則將高位補0
}
// 注意此處和byte數組轉換成int的區別在於,下面的轉換中要將先將數組中的元素轉換成long型再作移位操做,
// 若直接作位移操做將得不到正確結果,由於Java默認操做數字時,若不加聲明會將數字做爲int型來對待,此處必須注意。
long v0 = (long) (a[0] & 0xff) << 56;// &0xff將byte值無差別轉成int,避免Java自動類型提高後,會保留高位的符號位
long v1 = (long) (a[1] & 0xff) << 48;
long v2 = (long) (a[2] & 0xff) << 40;
long v3 = (long) (a[3] & 0xff) << 32;
long v4 = (long) (a[4] & 0xff) << 24;
long v5 = (long) (a[5] & 0xff) << 16;
long v6 = (long) (a[6] & 0xff) << 8;
long v7 = (long) (a[7] & 0xff);
return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7;
}
4.float與byte數組的互轉
[java] view plaincopy
/**
* float轉換byte
*
* @param bb
* @param x
* @param index
*/
public static void putFloat(byte[] bb, float x, int index) {
// byte[] b = new byte[4];
int l = Float.floatToIntBits(x);
for (int i = 0; i < 4; i++) {
bb[index + i] = new Integer(l).byteValue();
l = l >> 8;
}
}
/**
* 經過byte數組取得float
*
* @param bb
* @param index
* @return
*/
public static float getFloat(byte[] b, int index) {
int l;
l = b[index + 0];
l &= 0xff;
l |= ((long) b[index + 1] << 8);
l &= 0xffff;
l |= ((long) b[index + 2] << 16);
l &= 0xffffff;
l |= ((long) b[index + 3] << 24);
return Float.intBitsToFloat(l);
}
5.double與byte數組的互轉
[java] view plaincopy
/**
* double轉換byte
*
* @param bb
* @param x
* @param index
*/
public static void putDouble(byte[] bb, double x, int index) {
// byte[] b = new byte[8];
long l = Double.doubleToLongBits(x);
for (int i = 0; i < 4; i++) {
bb[index + i] = new Long(l).byteValue();
l = l >> 8;
}
}
/**
* 經過byte數組取得float
*
* @param bb
* @param index
* @return
*/
public static double getDouble(byte[] b, int index) {
long l;
l = b[0];
l &= 0xff;
l |= ((long) b[1] << 8);
l &= 0xffff;
l |= ((long) b[2] << 16);
l &= 0xffffff;
l |= ((long) b[3] << 24);
l &= 0xffffffffl;
l |= ((long) b[4] << 32);
l &= 0xffffffffffl;
l |= ((long) b[5] << 40);
l &= 0xffffffffffffl;
l |= ((long) b[6] << 48);
l &= 0xffffffffffffffl;
l |= ((long) b[7] << 56);
return Double.longBitsToDouble(l);
更多關於字符串和序列化的轉換請參看下面兩篇文章: