java int 對象 與byte[4] 對象之間的轉換, 以及大端模式與小端模式的說明

數據在內存中有兩種模式存儲 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;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章