數據在內存中有兩種模式存儲 1 大端模式-高字節在前, 2小端模式-高字節在後
由於代碼裏有足夠詳細的說明, 直接上代碼:
/**
* 轉換成大端模式-高字節在前(java爲高字節在前,內存數組第0位表示最前)
*
* 有關高字節與低字節的說明:
* 大端模式: Big-Endian 就是高位字節(書寫順序的最左邊)排放在內存的低地址端(數組第0位),低位字節排放在內存的高地址端
* 小端模式: Little-Endian 就是低位字節(書寫順序的最左邊)排放在內存的低地址端(數組第0位),高位字節排放在內存的高地址端
* 記憶方法: 就是看誰先放於低位地址(數組第0位),如果是高位字節就是大端;如果是低位字節就是小端。
*
* 所以在TCP/IP協議規定了在網絡上必須採用網絡字節順序,也就是大端模式。對於char型數據只佔一個字節,無所謂大端和小端。
* 存儲量大於1字節,如int,float等,要考慮字節的順序問題了.
* java由於虛擬機的關係,屏蔽了大小端問題
* 1. 網絡字節序是, 大端模式, 也就是高字節在前
* 2. C++是主機字節序(高、低都有可能)
* 3. JAVA是網絡字節序,大端模式,也就是高字節在前
*
* 例子:
* 10進制: 1111111111
* 二進制: 01000010 00111010 00110101 11000111
* 16進制: 42 3A 35 C7
* 內存地址數組: 第0位,第1位,第2位,第3位 (第0位是起始地址,第3位是結束地址,起始地址當然是最低位)
* 大端模式存儲結果:42 3A 35 C7 (42是高位字節,存儲在起始地址,也是第0位地址,也是低位地址, 與書寫順序一樣, 高字節在前, 低字節在後)
* 小端模式存儲結果:C7 35 3A 42 (C7是低位字節,存儲在起始地址,也是第0位地址,也是低位地址, 與書寫順序相反, 低字節在前, 高字節在後)
*/
public static byte[] intToByte4B(int n) {
byte[] b = new byte[4];
b[0] = (byte) (n >> 24 & 0xff); //數據組起始位,存放內存起始位, 即:高字節在前
b[1] = (byte) (n >> 16 & 0xff); //高字節在前是與java存放內存一樣的, 與書寫順序一樣
b[2] = (byte) (n >> 8 & 0xff);
b[3] = (byte) (n & 0xff);
return b;
}
/**
* 轉換成小端模式-高字節在後(java爲高字節在前,內存數組第0位表示最前)
*/
public static byte[] intToByte4L(int n) {
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
b[2] = (byte) (n >> 16 & 0xff);//高字節在後是與java存放內存相反, 與書寫順序相反
b[3] = (byte) (n >> 24 & 0xff);//數據組結束位,存放內存起始位, 即:高字節在後
return b;
}
/**
* 整數到字節數組轉換,java爲高字節在前(數組0表示最前)
*/
public static int byte4ToIntB(byte b[]) {
int s = 0;
s = ((((b[0] & 0xff) << 24 | (b[1] & 0xff)) << 16) | (b[2] & 0xff)) << 8| (b[3] & 0xff);
return s;
}
/**
* 整數到字節數組轉換,java爲高字節在後(數組3表示最前)
*/
public static int byte4ToIntL(byte b[]) {
int s = 0;
s = ((((b[3] & 0xff) << 24 | (b[2] & 0xff)) << 16) | (b[1] & 0xff)) << 8| (b[0] & 0xff);
return s;
}