HTML/JavaScript小工具

HTML/JavaScript小工具

2014年3月27日 星期四

socket-2 基本型(int,long,short)分割成byte


因為要將基本型態轉成byte以下是自己手動轉型的方法
因為TCP 傳送是Byte形式所以~基本型態都必須分解成byte

假設我想要把int分解成byte模式作法如下

1 先算出1個整數有多少個Byte等等需要建立一個byte陣列儲存
 int size = Integer.SIZE / Byte.SIZE;

        int test1 = 512;
        byte[] byteArray = new byte[size];

2選告一個遮罩(mask)0xff是16位元~顯示方法算成2進位
1111 1111 剛好八位元
        int mask = 0xff;
     
3 一個迴圈將所有的整數取出,放置於一個byte陣列
        for (int i = 0; i < size;i++){
            byteArray[i] = (byte)(test1 >> (size - i - 1) * Byte.SIZE);
        }
解釋一下:
因為要將int分解存到byte ,int 是32bit byte是 8bit所以需要4長度的陣列存
每次取8個bit進到陣列裡
下面解釋一下算法~~
512整數轉成2進位如下
      1                2                3            4
00000000 00000000  00000010 00000000
我們取數字先由前面開始取所以需要將1往前移 8 * 3位置
00000000 00000000  00000010 00000000
以上來說1 位移24格後 再轉換成byte(只取8位數) 是0
以上來說2 位移16格後 再轉換成byte(只取8位數) 是0
以上來說3 位移8格後 再轉換成byte(只取8位數) 是2
以上來說4 位移0格後 再轉換成byte(只取8位數) 是0
會將這些數字存到陣列內

下面是還原
1 先宣告一個長整數(因為長整數是java整數基本型態中最大的數嘍)
        long show = 0;
2 將所有儲存於byte陣列的內容取出來
         for (int i = 0; i < size;i++){
             show = ((show << Byte.SIZE) | (byteArray[i] & mask));          
         }
        System.out.println(show);
解釋一下做法
一樣假設512

因為一開始都是零 所以 先將後面的bit往前推8個位置 不會變化
一開始取出來的是00000000  合併這時是
00000000
  後面的bit往前推8
第二筆取出來的是00000000   合併這時是
00000000  00000000
 後面的bit往前推8
第三筆取出來的是00000010 合併這時是
00000000  00000000  00000010
後面的bit往前推8
第四筆取出來的是00000000 合併這時是
00000000  00000000  00000010 00000000
每次取出來一筆就把內show的最後面8位數向前移動,並且將8bit數字整合起來
以上解釋~

有更簡單的解法
使用以下物件
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);

dos.writeByte(byteVal);
dos.writeShort(shortVal);
dos.writeInt(intVal);
dos.writeLong(longVal);
dos.flush();

System.out.println("Decoded message: "
+ dis.readByte() + " " + dis.readShort() + " " + dis.readInt() + " " + dis.readLong());

一樣可以將基本資料形態變成byte~~


沒有留言:

張貼留言