開這網站的目的是發現有很多人想了解電腦相關資訊,補習費用也不便宜,下了班很累想休息一下時間無法配合於是想分享我所學 未來會包含課程規劃會有: 程式語言上:Java、C#、PHP.. 手機設計:Android,、ObjectC 認證包含:SCJP、SCWCD、LPI1~LPI2.... 網頁設計:HTML5、JavaScript.... 陸陸續續會再增加! 以上課程都是我本人教學如有任何問題可在此留言我會答覆您的
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~~
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言