为什么1byte=8bit?

下面内容多来自维基百科,少部分来自其他页面,汇总如下:
1.其实编码这个问题最早可以追溯到Baudotcode甚至Bacon’scipher,因为语言、文字、图腾这些其实都是一种编码方式,编码其实就是制定一套表达规范。


2.早期计算机使用4位二进制编码(BCD)或6位二进制编码(BCDIC),主要用于美国陆军、海军打印图形。
BCD只有4位,表示数字就从0000到1001的最多10个块,因此非数字字符几乎都在BCD范围之外;BCDIC虽然有6位字符,但还是不够,囊括完大写字母、小写字母和数字,那么标点符号只能存2个,所以大多数字符集中只收集一种字母。


3.1963年编码被扩充为7位二进制编码,也就是ASCII码(美国信息交换标准码),它被美国联邦设定为信息处理的标准,以此取代了不同机构的互不兼容的电传打字机代码。ASCII码包含了大小写字母以及一些控制字符,便于书面传输以及打印,还便于传输媒介中数据流的物理控制和逻辑控制。


4.1960年代初期,积极参与ASCII标准化的同时,IBM在其System/360产品线中引入了8位扩展二进制编码交换代码(EBCDIC),这是在他们之前在卡片穿孔机上使用的六位二进制编码(BCDIC)的扩展。System/360的重要性导致社会普遍采用8位存储大小,从这时开始1byte=8bit兴起。


5.当然注意EBCDIC和ASCII是不同的。
EBCDIC代码页中有四个主要块:00000000到00111111保留用于控制字符;01000000至01111111用于标点符号;小写字符为10000000至10111111;大写字符和数字为11000000至11111111。
EBCDIC如今还是更多用于IBM大型机系统(中型机用的都不一样,互不兼容),因为它设计的时候就是为了穿孔方便。而且因为EBCDIC比ASCII多一位,所以能表示的符号也更多,比如’¢’字符。ASCII码因为只有7位,而内存是8位,所以多出来的一位会被用于当做奇偶校验位。当然以ASCII为基础,现在已经形成了大多数新字符集(ISO646,ISO8859,Unicode和ISO10646等),这些字符集已经变为16位和32位。


6.顺便说一句,字节的单位符号是被国际电工委员会(IEC)、电气和电子工程师协会(IEEE)共同指定为大写字母B的。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public static String encode(byte[] binaryData) { if (binaryData == null) { return null; } int lengthDataBits = binaryData.length * EIGHTBIT; if (lengthDataBits == 0) { return ""; } int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; char[] encodedData = null; encodedData = new char[numberQuartet * 4]; byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; int encodedIndex = 0; int dataIndex = 0; for (int i = 0; i < numberTriplets; i++) { b1 = binaryData[dataIndex++]; b2 = binaryData[dataIndex++]; b3 = binaryData[dataIndex++]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; } // form integral number of 6-bit groups if (fewerThan24bits == EIGHTBIT) { b1 = binaryData[dataIndex]; k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD; } else if (fewerThan24bits == SIXTEENBIT) { b1 = binaryData[dataIndex]; b2 = binaryData[dataIndex + 1]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; encodedData[encodedIndex++] = PAD; } return new String(encodedData); }重构该方法,将其认知复杂度从18降低到允许的15。
最新发布
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值