最近因為解析socket 于是就遇到二進制這些東西,在學校沒學好而且以前不是很理解,所有重新開始溫故了一些基本概念,
首先是進制的概念,所謂的進制就是數學計算的具體多少而進位的一種算法。比如二進制,就只有0和1 他們基本是到2就進位。
而現實生活中也有各種進位方式,比如常用的十進制,我們基本貨幣計算就是這種方式,因此還有八進位,十六進位等等,
下面我把這些進位對應的英文也列出來,以為在編程的時候 常常看到的命名是相關英文而非中文,理解這樣英文便于你的具體
應用或者查看別人API。
十進制數(Decimal)
二進制數(Binary)
七進制數(septenary)
八進制數(Octal)
十六進制數(Hex)
六十進位制數(Sixty binary)
其實本身這些進制都是機器可讀的語言,對應同樣的東西 他們只是表達的方式不一樣,表達的都是同一個東西,
那么本身進制直接可能通過操作相互轉化,這個轉化就比較枯燥,一般語言都提供API來封裝了這個轉化過程。
進制數我剛才說了,我理解為機器可讀的標識,那么對應人的話,一般我們看到的都是圖形化的東西,因此最早老美提出了
ASCII,因為是老美提出來的,所以他只講他們的語言的基本元素A B C D...
ASCII里面分顯示字符和控制字符,一般控制字符不能顯示在頁面。
具體可以參考
http://zh.wikipedia.org/zh/ASCII
隨著全球化的進程,ASCII太局限了,因此Unicode更為普及。
理解了基本原理: 我們調用apache Codec 的api 來看看
org.apache.commons.codec.binary
Class BinaryCodec:
Translates between byte arrays and strings of "0"s and "1"s.
例子
String s ="00011111";
BinaryCodec bc = new BinaryCodec();
byte[] b = bc.toByteArray(s); //b 調試結果為 [31] 其實就是acii 上面描述的十進制表示
String t = new String(b); //t 不能看到 因為這是控制字符
System.out.println(t);
如果
String s ="00100001";
BinaryCodec bc = new BinaryCodec();
byte[] b = bc.toByteArray(s); //b 調試結果為 [33] 其實就是acii 上面描述的十進制表示
String t = new String(b); //t 能看到 是字符!
System.out.println(t);
而這個s 必須是1 0表示的二進制。toByteArray這個應該表示將二進制顯示的字符串轉化為真正的顯示意義上的二進制。
String s ="00100001";
BinaryCodec bc = new BinaryCodec();
byte[] b = bc.toByteArray(s); //b=[33]
char[] d = bc.toAsciiChars(b); //d= [0, 0, 1, 0, 0, 0, 0, 1]
String str = bc.toAsciiString(b);//str = 00100001
byte[] e = bc.toAsciiBytes(b); //e = [48, 48, 49, 48, 48, 48, 48, 49]
BinaryCodec bc = new BinaryCodec();
char[] c = {'0','0','1','0','0','0','0','1'};
byte[] b = bc.fromAscii(c); //[33]
如果
char[] c = {'0','0','1','J','0','0','0','1'}; //表示二進制
還是//[33] 這說明除了1所有的char 在該API都認為是0,來處理二進制
如果是
char[] c = {'0','0','1','J','0','0','0'}; //七位
那么b 就為空[]
如果是九位
char[] c = {'0','0','1','J','0','0','0','0'}; //九位
如果最后一位為1 那么結果 b=[65]
如果為非1 比如0 或者其他char 那么結果b=[64]
方法
static byte[] fromAscii(byte[] ascii) 和上面的
static byte[] fromAscii(char[] ascii) 一樣
比如
byte[] i = {'0','0','1','J','0','0','0','0','l'};
byte[] b = bc.fromAscii(i); //b的結果仍然是b=[64]
但是 在調試看到i 顯示為 i=[48, 48, 49, 74, 48, 48, 48, 48, 108]
////////////////解碼
byte[] decode(byte[] ascii) 將1,0 表示的byte數組解碼為相應的byte
比如:
BinaryCodec bc = new BinaryCodec();
byte[] i = {'0','0','1','J','0','0','0','0','l'}; //i=[48, 48, 49, 74, 48, 48, 48, 48, 108]
byte[] b = bc.decode(i); //b=[64]
再比如:Object decode(Object ascii) :
String s ="00011111";
BinaryCodec bc = new BinaryCodec();
try {
Object t =bc.decode(s); //t=[31]
System.out.println(t);
} catch (DecoderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/////////////////編碼
將byte轉化為1,0 表示的byte數組
byte[] encode(byte[] raw)
Object encode(Object raw)
例如:
String s ="00011111";
BinaryCodec bc = new BinaryCodec();
try {
Object t =bc.encode(s);
System.out.println(t);
} catch (EncoderException e) {
// TODO Auto-generated catch block
e.printStackTrace(); //會拋出e:org.apache.commons.codec.EncoderException: argument not a byte array
}
如果
byte[] i = {'!'};
BinaryCodec bc = new BinaryCodec();
Object t =bc.encode(i); //t=[48, 48, 49, 48, 48, 48, 48, 49]
System.out.println(t);