byte與進位制及基本型別間的轉換
阿新 • • 發佈:2019-02-19
java的API原始碼中隱含了一些對位元組處理的方法,以下複製黏貼或者修改後黏貼的程式碼。
上面這個是舉例,方法來源於Bits.class檔案。//把byte[]轉成int的方法,off指byte的開始位置 static int getInt(byte[] b, int off) { return ((b[off + 3] & 0xFF) << 0) + ((b[off + 2] & 0xFF) << 8) + ((b[off + 1] & 0xFF) << 16) + ((b[off + 0]) << 24); } //把int轉成byte[]的方法 static void putInt(byte[] b, int off, int val) { b[off + 3] = (byte) (val >>> 0); b[off + 2] = (byte) (val >>> 8); b[off + 1] = (byte) (val >>> 16); b[off + 0] = (byte) (val >>> 24); }
以下是這個檔案的所有方法。
/* * Methods for unpacking primitive values from byte arrays starting at * given offsets. */ static boolean getBoolean(byte[] b, int off) { return b[off] != 0; } static char getChar(byte[] b, int off) { return (char) (((b[off + 1] & 0xFF) << 0) + ((b[off + 0]) << 8)); } static short getShort(byte[] b, int off) { return (short) (((b[off + 1] & 0xFF) << 0) + ((b[off + 0]) << 8)); } static int getInt(byte[] b, int off) { return ((b[off + 3] & 0xFF) << 0) + ((b[off + 2] & 0xFF) << 8) + ((b[off + 1] & 0xFF) << 16) + ((b[off + 0]) << 24); } static float getFloat(byte[] b, int off) { int i = ((b[off + 3] & 0xFF) << 0) + ((b[off + 2] & 0xFF) << 8) + ((b[off + 1] & 0xFF) << 16) + ((b[off + 0]) << 24); return Float.intBitsToFloat(i); } static long getLong(byte[] b, int off) { return ((b[off + 7] & 0xFFL) << 0) + ((b[off + 6] & 0xFFL) << 8) + ((b[off + 5] & 0xFFL) << 16) + ((b[off + 4] & 0xFFL) << 24) + ((b[off + 3] & 0xFFL) << 32) + ((b[off + 2] & 0xFFL) << 40) + ((b[off + 1] & 0xFFL) << 48) + (((long) b[off + 0]) << 56); } static double getDouble(byte[] b, int off) { long j = ((b[off + 7] & 0xFFL) << 0) + ((b[off + 6] & 0xFFL) << 8) + ((b[off + 5] & 0xFFL) << 16) + ((b[off + 4] & 0xFFL) << 24) + ((b[off + 3] & 0xFFL) << 32) + ((b[off + 2] & 0xFFL) << 40) + ((b[off + 1] & 0xFFL) << 48) + (((long) b[off + 0]) << 56); return Double.longBitsToDouble(j); } /* * Methods for packing primitive values into byte arrays starting at given * offsets. */ static void putBoolean(byte[] b, int off, boolean val) { b[off] = (byte) (val ? 1 : 0); } static void putChar(byte[] b, int off, char val) { b[off + 1] = (byte) (val >>> 0); b[off + 0] = (byte) (val >>> 8); } static void putShort(byte[] b, int off, short val) { b[off + 1] = (byte) (val >>> 0); b[off + 0] = (byte) (val >>> 8); } static void putInt(byte[] b, int off, int val) { b[off + 3] = (byte) (val >>> 0); b[off + 2] = (byte) (val >>> 8); b[off + 1] = (byte) (val >>> 16); b[off + 0] = (byte) (val >>> 24); } static void putFloat(byte[] b, int off, float val) { int i = Float.floatToIntBits(val); b[off + 3] = (byte) (i >>> 0); b[off + 2] = (byte) (i >>> 8); b[off + 1] = (byte) (i >>> 16); b[off + 0] = (byte) (i >>> 24); } static void putLong(byte[] b, int off, long val) { b[off + 7] = (byte) (val >>> 0); b[off + 6] = (byte) (val >>> 8); b[off + 5] = (byte) (val >>> 16); b[off + 4] = (byte) (val >>> 24); b[off + 3] = (byte) (val >>> 32); b[off + 2] = (byte) (val >>> 40); b[off + 1] = (byte) (val >>> 48); b[off + 0] = (byte) (val >>> 56); } static void putDouble(byte[] b, int off, double val) { long j = Double.doubleToLongBits(val); b[off + 7] = (byte) (j >>> 0); b[off + 6] = (byte) (j >>> 8); b[off + 5] = (byte) (j >>> 16); b[off + 4] = (byte) (j >>> 24); b[off + 3] = (byte) (j >>> 32); b[off + 2] = (byte) (j >>> 40); b[off + 1] = (byte) (j >>> 48); b[off + 0] = (byte) (j >>> 56); }
在DataInputStream裡也有部分這種方法。
//修改自DataInputStream裡的方法 public static int toInt(byte[] b,int off) throws EOFException { int ch1 = b[off+0]; int ch2 = b[off+1]; int ch3 = b[off+2]; int ch4 = b[off+3]; if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); }
不過這個類原始碼中只有轉成基本型別的方法,仔細看和Bits.class檔案裡的方法差不多。
系統對基本型別轉成的byte是低位儲存高位。
比如short型別有16位,第一個byte儲存高8位,第二個位元組儲存低8位。
下面方法來源於網路,沒全部驗證其正確性。注意:其中有些轉byte的方法是把低位儲存在低位。
//long型別轉成byte陣列 public static byte[] longToByte(long number) {
long temp = number;
byte[] b = new byte[8];
for (int i = 0; i < b.length; i++) {
b[i] = new Long(temp & 0xff).byteValue();// 將最低位儲存在最低位
temp = temp >> 8; // 向右移8位
}
return b;
}
//byte陣列轉成long
public static long byteToLong(byte[] b) {
long s = 0;
long s0 = b[0] & 0xff;// 最低位
long s1 = b[1] & 0xff;
long s2 = b[2] & 0xff;
long s3 = b[3] & 0xff;
long s4 = b[4] & 0xff;// 最低位
long s5 = b[5] & 0xff;
long s6 = b[6] & 0xff;
long s7 = b[7] & 0xff;
// s0不變
s1 <<= 8;
s2 <<= 16;
s3 <<= 24;
s4 <<= 8 * 4;
s5 <<= 8 * 5;
s6 <<= 8 * 6;
s7 <<= 8 * 7;
s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7;
return s;
}
/**
* 註釋:int到位元組陣列的轉換!
*
* @param number
* @return
*/
public static byte[] intToByte(int number) {
int temp = number;
byte[] b = new byte[4];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();//將最低位儲存在最低位
temp = temp >> 8; // 向右移8位
}
return b;
}
/**
* 註釋:位元組陣列到int的轉換!
*
* @param b
* @return
*/
public static int byteToInt(byte[] b) {
int s = 0;
int s0 = b[0] & 0xff;// 最低位
int s1 = b[1] & 0xff;
int s2 = b[2] & 0xff;
int s3 = b[3] & 0xff;
s3 <<= 24;
s2 <<= 16;
s1 <<= 8;
s = s0 | s1 | s2 | s3;
return s;
}
/**
* 註釋:short到位元組陣列的轉換!
*
* @param s
* @return
*/
public static byte[] shortToByte(short number) {
int temp = number;
byte[] b = new byte[2];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 將最低位儲存在最低位
temp = temp >> 8; // 向右移8位
}
return b;
}
/**
* 註釋:位元組陣列到short的轉換!
*
* @param b
* @return
*/
public static short byteToShort(byte[] b) {
short s = 0;
short s0 = (short) (b[0] & 0xff);// 最低位
short s1 = (short) (b[1] & 0xff);
s1 <<= 8;
s = (short) (s0 | s1);
return s;
}
//把byte轉成16進位制
public static final String toHex(byte b) {//32位右移4位再把高28位清零,即求出來的是這個32位中的第四到第八位
// ....0000001111&b
return ("" + "0123456789ABCDEF".charAt(0xf & b >> 4) + "0123456789ABCDEF".charAt(b & 0xf));
}
//把16進位制的字串轉成byte[]
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
/**
* Convert char to byte
* @param c char
* @return byte
*/
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c); //返回字元的十進位制數並轉成2進位制,1byte等於8位ASCII
}
//把byte[]轉成16進位制顯示.
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;
}