========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
網站:www.qiujuer.net
開源庫:github.com/qiujuer/Genius-Android
開源庫:github.com/qiujuer/Blink
轉載請註明出處:http://blog.csdn.net/qiujuer/article/details/45152189
------學之開源,用於開源;初學者的心態,與君共勉!
========================================================
很久沒有寫博客了,有些生疏了;一直忙着做 Blink 框架去了。
在這裏打個廣告,Blink是一款Socket協議跨平臺框架,現在提供有Java、Android、C#的版本;通過Blink能實現對Socket傳輸的異步封裝,能直接發送或接受數據,現能直接發送 byte ,String,File 等類型,可在不改動框架情況下直接擴展所需類型。
因爲在Socket的傳輸中都是 Bytes 的傳輸,所以涉及到 Java 基本類型(char、short、int、long)與byte[] 的轉化,自己總結了一下,簡單的寫了一個類。
/**
* Bit Converter
*/
public class BitConverter {
/**
* Convert char to byte[]
*
* @param x char
* @return bytes
*/
public static byte[] toBytes(char x) {
return toBytes(x, new byte[2], 0);
}
/**
* Convert char to byte[]
*
* @param x char
* @param bytes Dest bytes
* @param bytePos Dest pos
* @return bytes
*/
public static byte[] toBytes(char x, byte[] bytes, int bytePos) {
bytes[bytePos++] = (byte) (x);
bytes[bytePos] = (byte) (x >> 8);
return bytes;
}
/**
* Convert short to byte[]
*
* @param x Short
* @return bytes
*/
public static byte[] toBytes(short x) {
return toBytes(x, new byte[2], 0);
}
/**
* Convert short to byte[]
*
* @param x Short
* @param bytes Dest bytes
* @param bytePos Dest pos
* @return bytes
*/
public static byte[] toBytes(short x, byte[] bytes, int bytePos) {
bytes[bytePos++] = (byte) (x);
bytes[bytePos] = (byte) (x >> 8);
return bytes;
}
/**
* Convert int to byte[]
*
* @param x int
* @return bytes
*/
public static byte[] toBytes(int x) {
return toBytes(x, new byte[4], 0);
}
/**
* Convert int to byte[]
*
* @param x int
* @param bytes Dest bytes
* @param bytePos Dest pos
* @return bytes
*/
public static byte[] toBytes(int x, byte[] bytes, int bytePos) {
bytes[bytePos++] = (byte) (x);
bytes[bytePos++] = (byte) (x >> 8);
bytes[bytePos++] = (byte) (x >> 16);
bytes[bytePos] = (byte) (x >> 24);
return bytes;
}
/**
* Convert long to byte[]
*
* @param x long
* @return bytes
*/
public static byte[] toBytes(long x) {
return toBytes(x, new byte[8], 0);
}
/**
* Convert long to byte[]
*
* @param x long
* @param bytes Dest bytes
* @param bytePos Dest pos
* @return bytes
*/
public static byte[] toBytes(long x, byte[] bytes, int bytePos) {
bytes[bytePos++] = (byte) (x);
bytes[bytePos++] = (byte) (x >> 8);
bytes[bytePos++] = (byte) (x >> 16);
bytes[bytePos++] = (byte) (x >> 24);
bytes[bytePos++] = (byte) (x >> 32);
bytes[bytePos++] = (byte) (x >> 40);
bytes[bytePos++] = (byte) (x >> 48);
bytes[bytePos] = (byte) (x >> 56);
return bytes;
}
/**
* Convert byte[] to char
*
* @param bytes bytes
* @return char
*/
public static char toChar(byte[] bytes) {
return toChar(bytes, 0);
}
/**
* Convert byte[] to char
*
* @param bytes bytes
* @param index byte start index
* @return char
*/
public static char toChar(byte[] bytes, int index) {
return (char) ((bytes[index + 1] << 8) | (bytes[index] & 0xff));
}
/**
* Convert byte[] to short
*
* @param bytes bytes
* @return short
*/
public static short toShort(byte[] bytes) {
return toShort(bytes, 0);
}
/**
* Convert byte[] to short
*
* @param bytes bytes
* @param index byte start index
* @return short
*/
public static short toShort(byte[] bytes, int index) {
return (short) ((bytes[index + 1] << 8) | (bytes[index] & 0xff));
}
/**
* Convert byte[] to int
*
* @param bytes bytes
* @return int
*/
public static int toInt(byte[] bytes) {
return toInt(bytes, 0);
}
/**
* Convert byte[] to int
*
* @param bytes bytes
* @param index bytes start index
* @return int
*/
public static int toInt(byte[] bytes, int index) {
return (((bytes[index + 3]) << 24) |
((bytes[index + 2] & 0xff) << 16) |
((bytes[index + 1] & 0xff) << 8) |
((bytes[index] & 0xff)));
}
/**
* Convert byte[] to long
*
* @param bytes bytes
* @return long
*/
public static long toLong(byte[] bytes) {
return toLong(bytes, 0);
}
/**
* Convert byte[] to long
*
* @param bytes bytes
* @param index bytes start index
* @return long
*/
public static long toLong(byte[] bytes, int index) {
return ((((long) bytes[index + 7]) << 56) |
(((long) bytes[index + 6] & 0xff) << 48) |
(((long) bytes[index + 5] & 0xff) << 40) |
(((long) bytes[index + 4] & 0xff) << 32) |
(((long) bytes[index + 3] & 0xff) << 24) |
(((long) bytes[index + 2] & 0xff) << 16) |
(((long) bytes[index + 1] & 0xff) << 8) |
(((long) bytes[index] & 0xff)));
}
}
需要注意的是:無論是從基本類型轉換爲 byte[] 還是 byte[] 轉換爲基本類型, 都是採用的低位在前高位在後的形式;這個與C#的默認模式是一致的,如果你的需求是高位在前的情況則需要自己更改一下順序了。
========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
網站:www.qiujuer.net
開源庫:github.com/qiujuer/Genius-Android
開源庫:github.com/qiujuer/Blink
轉載請註明出處:http://blog.csdn.net/qiujuer/article/details/45152189
------學之開源,用於開源;初學者的心態,與君共勉!
========================================================