天氣:陰轉(zhuǎn)晴 風(fēng)力:微風(fēng)
byte組合byte[]
- System.arraycopy()
- Arrays.copyOf() 內(nèi)部使用#1實(shí)現(xiàn),原理是新建一個(gè)大的字節(jié)數(shù)組,再?gòu)?fù)制進(jìn)去
- 直接初始化byte[] bytes = {byte1, byte2, byte3};
byte[]與其他基本類型互轉(zhuǎn)
byte[]轉(zhuǎn)基本類型實(shí)質(zhì)是根據(jù)要轉(zhuǎn)的類型循環(huán)取每一字節(jié)按位置偏移8、16、24等,并通過(guò)&0xFF、&0xFFFF、&0xFFFFFF去除高位1后 “|” 操作組合,最后輸出或者通過(guò)Float.intBitsToFloat(),Double.longBitsToDouble()等轉(zhuǎn)為所需類型
基本類型轉(zhuǎn)byte[]實(shí)質(zhì)是先轉(zhuǎn)為int、long等可又16進(jìn)制表示的類型(Float.floatToIntBits()等),然后通過(guò)byteValue()取最高位的一個(gè)字節(jié),再向右偏移8位取下一個(gè)字節(jié)
public class BytesCodec {
//Byte和int之間的轉(zhuǎn)換
/**
* 將32位的int值放到4字節(jié)的里
*
* @param num
* @return
*/
public static byte[] int2byteArray(int num) {
byte[] result = new byte[4];
result[0] = (byte) (num >>> 24);//取最高8位放到0下標(biāo)
result[1] = (byte) (num >>> 16);//取次高8為放到1下標(biāo)
result[2] = (byte) (num >>> 8); //取次低8位放到2下標(biāo)
result[3] = (byte) (num); //取最低8位放到3下標(biāo)
return result;
}
/**
* 將4字節(jié)的byte數(shù)組轉(zhuǎn)成一個(gè)int值
*
* @param b
* @return
*/
public static int byteArray2int(byte[] b) {
byte[] a = new byte[4];
int i = a.length - 1, j = b.length - 1;
for (; i >= 0; i--, j--) {//從b的尾部(即int值的低位)開(kāi)始copy數(shù)據(jù)
if (j >= 0)
a[i] = b[j];
else
a[i] = 0;//如果b.length不足4,則將高位補(bǔ)0
}
int v0 = (a[0] & 0xff) << 24;//&0xff將byte值無(wú)差異轉(zhuǎn)成int,避免Java自動(dòng)類型提升后,會(huì)保留高位的符號(hào)位
int v1 = (a[1] & 0xff) << 16;
int v2 = (a[2] & 0xff) << 8;
int v3 = (a[3] & 0xff);
return v0 + v1 + v2 + v3;
}
//short和byte的互轉(zhuǎn)
/**
* 轉(zhuǎn)換short為byte
*
* @param b
* @param s 需要轉(zhuǎn)換的short
* @param index
*/
public static void putShort(byte b[], short s, int index) {
b[index + 1] = (byte) (s >> 8);
b[index + 0] = (byte) (s >> 0);
}
/**
* 通過(guò)byte數(shù)組取到short
*
* @param b
* @param index 第幾位開(kāi)始取
* @return
*/
public static short getShort(byte[] b, int index) {
return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
}
//byte和char類型的轉(zhuǎn)換
/**
* 字符到字節(jié)轉(zhuǎn)換
*
* @param ch
* @return
*/
public static void putChar(byte[] bb, char ch, int index) {
int temp = (int) ch;
// byte[] b = new byte[2];
for (int i = 0; i < 2; i++) {
// 將最高位保存在最低位
bb[index + i] = new Integer(temp & 0xff).byteValue();
temp = temp >> 8; // 向右移8位
}
}
/**
* 字節(jié)到字符轉(zhuǎn)換
*
* @param b
* @return
*/
public static char getChar(byte[] b, int index) {
int s = 0;
if (b[index + 1] > 0)
s += b[index + 1];
else
s += 256 + b[index + 0];
s *= 256;
if (b[index + 0] > 0)
s += b[index + 1];
else
s += 256 + b[index + 0];
char ch = (char) s;
return ch;
}
//byte和float的轉(zhuǎn)換
/**
* float轉(zhuǎn)換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;
}
}
/**
* 通過(guò)byte數(shù)組取得float
*
* @param b
* @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);
}
//byte和double轉(zhuǎn)換
/**
* double轉(zhuǎn)換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;
}
}
/**
* 通過(guò)byte數(shù)組取得float
*
* @param b
* @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);
}
}