精华内容
下载资源
问答
  • 常被用于无法事先得知上界的正整数,即一种变长编码方式。 CocosBuilder的ccb文件中的正整数正是采用了这种编码方式,被编码到了ccbi文件中(ccbi是二进制文件)。 在Cocos2dx引擎中,CCBReader再利用Elias gamma ...

    Elias gamma code

    1.简介

    Elias gamma code 是一种用于正整数的通用编码,由Peter Elias发明。常被用于无法事先得知上界的正整数,即一种变长编码方式。
    CocosBuilder的ccb文件中的整数正是采用了这种编码方式,被编码到了ccbi文件中(ccbi是二进制文件)。
    在Cocos2dx引擎中,CCBReader利用了Elias gamma code 的解码方式,将ccbi文件中的整数解析出来。

    2.名词解释

    有效位:一个二进制数从左往右第一个为1的位及其之后所有位叫有效位,其余称无效位,如:0 000 1 0001
    floor:向下取整,即[X,X+1)区间中的所有数都取X;

    3.编码原理

    我们都知道,int变量通常占4个字节(byte),每个字节8位(bit),共占32位,在计算机中以二进制存储。如果能剔除所有二进制数无效位,再将剩下有效位 紧密排列写进二进制文件里,就可以大大减少空间占用。这就是原理,很简单。

    举个栗子:
    剔除前:(17,11)10=(0000 0000 000 1 0001 ,0000 0000 0000 1011)2---->剔除后 (1 0001,1011)2

    我们看到17的有效位个数为 5,无效位个数为27。11的有效位个数是 4,无效位个数是28。
    然后对17和9剔除无效位,剔除后共占9位,剔除前,两个二进制数占了64位。

    但是又考虑到解码时必须指明被编码了的有效位个数,不然解码器不知道应该读到哪一位为止。还要进行进一步处理,即在二进制数的 有效位 前 放置 [有效位个数-1] 个0,此时编码完成。
    接着上面的例子,在17前加 4个0,在11前加 3个0。

    (1 0001,1011)2---->编码结果:(0 000 1 0001, 000 1011 )2

    最终,只用16位对原64位的两个数完成了编码。

    4.解码原理

    为什么加的0要比有效位个数少 1 ? 跟解码原理有关。
    解码时,从左往右读二进制串,一次读一位,边读边累计0的个数,记为 n 。当读到第一个有效位时,再继续往后读 n 位,即可完整读出一个整数的elias gamma编码。这正是 “在每个数的有效位前放置[有效位个数-1]个0” 的原因。
    通过统计0的个数,解码器就能知道遇到第一个有效位后,还剩几个有效位要读。

    看例子,编码后17和11的二进制码关于有效位对称,17和11的第一个有效位左右均是 n位:
    (0 0001 0001000 1011)2

    这样我们就能在二进制流中准确地读出一个又一个的elias gamma编码。读出编码后,再通过 或运算把编码的每一位映射到int变量的对应位上,即可还原该整数,完成解码。

    5.百度的描述

    前方介绍了通俗理解的编码过程。百度是这么描述的:

    5.1 对于待编码正整数X>=1 :
    令N=floor(log~2~X),故 2^N^<=X<=2^N+1^;
    输出N个0比特
    接着输出X的二进制表示
    
    5.2 对于待解码正整数X>=1 :
    读取并计数0比特直到第一个1比特出现,假设计数为N;
    从第一个1比特之后,再读取 N 个比特,并将之还原成十进制正整数,令之为 M
    最终解码为 2^N^+M
    

    6.特别注意

    6.1 从编码原理处可得,整数0不能用这种编码方式。

    那要想对0进行编码怎么办? 我们可以在编码前进行加1处理,解码后再减1处理。

    编码前,对整数+1,使0,1,2,3...->1,2,3,4...,再进行编码。
    解码后,对所得整数-1,使 1,2,3,4...->0,1,2,3...,即可还原。
    
    6.2 这种编码只适用正整数编码,

    那要对有符号整数进行编码怎么办? 我们可以通过分段函数把有符号整数一一映射成正整数。
    编码前,

    对整数X>=0,进行映射X=2*X+1,使0,1,2,3...->1,3,5,7...
    对整数X<0,进行映射X=-2*X,使-1,-2,-3...->2,4,6...
    

    解码后,判断所得整数的奇偶性,利用函数,即可还原。

    展开全文
  • UTF-8的能表示所有字符的原因:UTF-8最大的一个特点,就是它是一种变长编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。 1、ASCII编码:用来表示英文,它使用1个字节表示,其中第一位...

    UTF-8的能表示所有字符的原因:UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

    1、ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。
    2、拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符
    3、GBK/GB2312/GB18030:表示汉字。GBK/GB2312表示简体中文,GB18030表示繁体中文。
    4、Unicode编码:包含世界上所有的字符,是一个字符集。
    5、UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度

    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    1.ASCII码
    这是美国在19世纪60年代的时候为了建立英文字符和二进制的关系时制定的编码规范,它能表示128个字符,其中包括英文字符、阿拉伯数字、西文字符以及32个控制字符。它用一个字节来表示具体的字符,但它只用后7位来表示字符(2^7=128),最前面的一位统一规定为0。
    2.扩展的ASCII码
    原本的ASCII码对于英文语言的国家是够用了,但是欧洲国家的一些语言会有拼音,这时7个字节就不够用了。因此一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使 用的编码体系,可以表示最多256个符号。但这时问题也出现了:不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码 中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。这个问题就直接促使了Unicode编码的产生。
    3.Unicode符号集
    世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。而Unicode就是这样一种编码:它包含了世界上所有的符号,并且每一个符号都是独一无二的。比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表 。很多人都说Unicode编码,但其实Unicode是一个符号集(世界上所有符号的符号集),而不是一种新的编码方式。
    但是正因为Unicode包含了所有的字符,而有些国家的字符用一个字节便可以表示,而有些国家的字符要用多个字节才能表示出来。即产生了两个问题:第一,如果有两个字节的数据,那计算机怎么知道这两个字节是表示一个汉字呢?还是表示两个英文字母呢?第二,因为不同字符需要的存储长度不一样,那么如果Unicode规定用2个字节存储字符,那么英文字符存储时前面1个字节都是0,这就大大浪费了存储空间。
    上面两个问题造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。
    4.UTF-8
    互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

    5.GBK/GB2312/GB18030
    GBK和GB2312都是针对简体字的编码,只是GB2312只支持六千多个汉字的编码,而GBK支持1万多个汉字编码。而GB18030是用于繁体字的编码。汉字存储时都使用两个字节来储存。

    展开全文
  • 字符编码

    2020-10-05 11:58:42
    UTF-8(UCS Transformation Format)编码:对UCS进行编码,一种可变长编码,相比与Unicode编码效率更高,常用与文件存储和传输,一个中文字符占用3个字节 大端存储:先存储高字节 小端存储:先存储低字节 ...

    众所周知,计算机只能识别01串,字符在计算机以01串的形式存储,所以每个字符要用唯一的01串表示,这个过程称为字符编码

    ASCII(American Standard Code for Information Interchange)美国信息交换标准码

    由ANSI(American National Standard Institute)美国国家标准协会制定,1967年发布,主要用于显示英语和其他西欧语言,共收录了128个字符。后被ISO(International Organization for Standardization)国际标准化组织定为国际标准,称为ISO 646标准。由于ASCII只含有128个字符,使用1个字节就能表示全部的字符

    UCS(Universal Character Set)通用字符集

    由ISO制定的ISO 10646标准所定义的字符编码方式,与Unicode基本相同,UCS-2是使用2个字节来表示一个字符,是UTF-16的子集,UCS-4与UTF-32相同

    Unicode(万国码、统一码)

    由于ASCII的局限性,无法支持中文、日文等字符,各国分别制定了自己的编码标准,不同的编码标准使得交互很麻烦,统一码联盟为了解决这个问题,制定了Unicode,收录了世界上所有的字符,可以将它看成一个字符集。

    每个字符与一个值对应,这个值称为码点,前128个字符与ASCII相同,以汉字‘汉’为例,它的 Unicode 码点是 0x6C49,记为U+6C49,Unicode只规定了字符对应的码点的值,并没有规定码点在计算机怎么存储。

    UTF-8、UTF-16和UTF-32是常见的Unicode的实现方式,这些编码规定了码点在计算机中怎么存储(最终的01串)

    UTF-8

    UTF-8 是变长码,不同的字符使用的字节数可能不同,例如ASCII码占用1个字节,汉字占用3个字节。这个字节数与字符对应的码点的大小有关,码点小的使用的字节就少,码点大的使用的字节就多,使用的字节个数从 1 到 4 个不等,具有很强的扩展性。
    UTF-8 的编码规则是:

    ① 对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。

    ② 对于n字节的符号 (n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

    UTF-16

    UTF-16也是变长码,每个码元单位为2个字节,每个字符可能占用1或2个码元单位,即2个或4个字节,对于码点值在U+0000和U+FFFF内的字符,使用一个码元单位,对于码点值在U+10000和U+10FFFF内的字符,使用两个码元单位。

    当我们遇到两个字节时,到底是把这两个字节当作一个字符还是与后面的两个字节一起当作一个字符呢?

    这里有一个很巧妙的地方,在基本平面内,从 U+D800 到 U+DFFF 是一个空段,即这些码点不对应任何字符。因此,这个空段可以用来映射辅助平面的字符。

    辅助平面的字符位共有 2^20个,因此表示这些字符至少需要 20 个二进制位。UTF-16 将这 20 个二进制位分成两半,前 10 位映射在 U+D800 到 U+DBFF,称为高位(H),后 10 位映射在 U+DC00 到 U+DFFF,称为低位(L)。这意味着,一个辅助平面的字符,被拆成两个基本平面的字符表示。

    因此,当我们遇到两个字节,发现它的码点在 U+D800 到 U+DBFF 之间,就可以断定,紧跟在后面的两个字节的码点,应该在 U+DC00 到 U+DFFF 之间,这四个字节必须放在一起解读。

    UTF-32

    直接按照码点值存储,每个字符占用4个字节

    文件编码格式

    对于一个文件,我们可以读取文件开头来判断它的编码方式:

    EF BB BF    UTF-8
    FE FF     UTF-16/UCS-2,little endian
    FF FE     UTF-16/UCS-2,big endian
    FF FE 00 00  UTF-32/UCS-4,little endian
    00 00 FE FF  UTF-32/UCS-4,big endian

    big endian(大端存储):先存储高位字节

    little endian(小端存储):先存储低位字节

    展开全文
  • 经典变长指令-ModRM 硬编码 汇编 0x88 MOV Eb, Gb 0x89 MOV Ev, Gv 0x8A MOV Gb, Eb 0x8B MOV Gv, Ev G:通用寄存器 E:寄存器/内存 b:字节 v:Word、doubleword or quadword 当指令...

    回顾指令结构

    经典变长指令-ModRM

    硬编码 汇编
    0x88 MOV Eb, Gb
    0x89 MOV Ev, Gv
    0x8A MOV Gb, Eb
    0x8B MOV Gv, Ev
    • G:通用寄存器
    • E:寄存器/内存
    • b:字节
    • v:Word、doubleword or quadword

    当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M。

    该字节的8个位被分成了三个部分:

    其中,Reg/Opcode(第3、4、5位,共3个字节)描述指令中的G部分,即寄存器。

    寄存器宽度 000 001 010 011 100 101 110 111
    32 EAX ECX EDX EBX ESP EBP ESI EDI
    8 AL CL DL BL AH CH DH BH

    Mod(第6、7位)和R/M(第0、1、2位)共同描述指令中的E部分,即寄存器/内存。

    展开全文
  • 编码格式

    2019-03-27 15:48:23
    虽然世界通用的表unicode是有了,但是有人就发现这有点浪费资源啊。...utf-16是用两个字节来编码所有的字符,utf-32则选择用4个字节来编码,utf-8为了节省资源,采用变长编码,编码长度从1个字节到6个字节不等。可...
  • 编码问题

    2016-10-04 00:21:44
    节约型全球使用:UTF-8(可变长字节,英文字母1个字节,汉字3个字节,生僻字符4到6个字节) 二, 计算机系统通用的字符编码工作方式计算机内存中统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为
  • 80、81、82、83这几个编码并没有明确给出具体的操作码是什么。 特别说明:凡是出现Grp的,均参见TableA-6。 例如:80 65 08 FF的查表步骤: 第一个字节位80,查Table-2表,得到对应结构:Eb, lb。 第二个字节...
  • (字符和数字对于起来):python3支持国际通用Unicode,可以表示世界上任何书面语言的字符,默认16位2**16=65535,ASCII码是Unicode编码的子集 内置函数ord(),chr() >>> ord('A') 65 &...
  • 本着节约的精神,出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会...
  • python字符编码

    2018-07-26 07:31:16
    python字符编码 1、ASCII  美国信息交换标准代码,一个字节最多表示256个字符。 2、Unicode  Unicode 被称为万国码、国际码、统一码、单一码,Unicode... UTF-8 通用转化格式,UTF-8 最大的特点就是长度可...
  • 字符串编码

    2019-09-21 20:51:36
    UTF-8:Unicode的实现,互联网通用,字节变长(1-4) 转载 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 转载于:https://www.cnblogs.com/huilei/p/8056550.html...
  • 总结:ascii 一个字节 不可表示中文 GB2312 是中文编码 unicode 是一种通用编码,把所有语言都统一到一套编码里,这样就不会再有乱码问题 占两个字节(不便于传输、存储占用空间大) utf-8 可变长编码的unicode...
  • 字符编码之间的转换

    千次阅读 2016-12-27 23:31:45
    字符编码介绍 在严格的ASCII中,每个字元用7位元表示,一共规定了128个字符的编码;...UTF-8是一种针对Unicode的可长宽字符编码,又称为万国码(通用转换格式)。UTF-8用1到4字节编码Unicode字符。用在网页上可以
  • 字符集,编码解码

    2019-03-11 22:18:29
    本章内容:字符集的作用、分类;编码解码 编码:字符到字节是编码 * 解码:字节到字符是解码 * 字符集:Java字符使用16位的双字节存储,但是在实际文件... * UTF-8:变长unicode字符(1-3个字节),国际通用 *...
  • 目前使用的编码方式有:ASCII码(一个字节)、Unicode码(两个字节)、UTF-8码(可变长编码)。我们已经知道了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 ASCLL码 ASCII(American ...
  • Asp.net utf-8 编码中文乱码完全解决方案 2008-04-04 17:32:46 旧日重来 Unicode 编码正逐渐成为多语言支持的最通用解决方案。...对于不同数值范围的 Unicode 码,它采用变长的方式来编码:所有 ASCII ...
  • UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可长度字符编码,又称万国码,它包含全世界所有国家需要用到的字符,是国际编码通用性强,是用以解决国际上字符的一种多字节编码。由Ken ...
  • 利用旋转编码器使用寿命、运行稳定、对工作环境要求低等优点,设计了基于旋转编码器的转速测量模块。采用仪表通用协议一一MODBUSRTU,实现了与上位监控系统的串行通信。该模块已被成功应用于永磁可磁场控制系统...
  • 汉字常见字符集 GB2312 中国标准简体字符集,通行于中国大陆,中国大陆几乎所有的中文系统和国际化的软件都...是一种针对 Unicode的可长度字符编码通用性很好 可以表示中文、英文、韩语、日语... 常用字...
  • UTF-8 (8-bit Unicode Transformation Format)是一种针对Unicode的可长度字符编码,又称万国码,它包含全世界所有国家需要用到的字符,是国际编码通用性强,是用以解决国际上字符的一种多字节编码。由Ken ...
  • 它是一种可长度字符编码,又称万国码。 三、gbk 是国家标准GB2312基础上扩容后兼容GB2312的标准,它的编码不论是是中文还是英文都是用双字节来表示的,为了区分中文,将其最高位都设定为1,相比UTF-8来说通用性...
  • 字符集 定义:Java字符使用16位的双字节存储,但是在实际文件存储的数据有各 种字符集,需要正确操作,否则就有乱码的发生...变长unicode字符(1-3个字节),国际通用 UTF-16BE 定长unicode字符(2个字节),大端Big-...
  • 具有IoT板球模块的AAA电池供电的植物护理设备,这是一种基于ESP8266的IoT模块,专为无编码的电池电源IoT设计。 最近,我使用Cricket模块制作了一种植物护理设备。在接下来的几个步骤中,我将向您展示如何在没有任何...
  • matlab图片隐藏代码基于通用VLC映射(GVM)的JPEG比特流大容量无损数据隐藏 一种用于 JPEG 图像的高容量无损数据隐藏方案。 抽象的 JPEG 是最流行的图像格式,在我们的日常生活中被广泛使用。 因此,JPEG 图像的可逆...
  • C语言通用范例开发金典.part2.rar

    热门讨论 2012-08-31 14:18:18
    范例1-33 限制链表长度建立单链表 77 ∷相关函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相关函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 221
精华内容 88
关键字:

通用变长编码