最近因为解析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);