文字与编码的奥秘(下)

MATLAB优化算法工具箱完全指南:从线性规划到全局优化实战 从数值计算中的最优化问题出发,介绍如何借助MATLAB优化工具箱高效建模与求解。内容涵盖线性规划、整数规划、非线性规划及全局优化等核心场景,讲解linprog、fmincon、ga等主流求解器的选型逻辑与参数控制方法,并结合工程案例演示实时编辑器任务和optimoptions的实践技巧。针对常见报错与收敛性问题,提供系统化排查思路。无论学术研究还是工程应用,都能从中建立一套从模型构建到结果验证的完整优化流程。 阅读详情

在上篇文章中我们已经了解到,计算机内部是采用的二进制进行运算和存储的。通过计算机来代替我们进行日常的工作,必然会遇到如何进行运算以及数据如何进行存储的问题,本篇文章我将和大家一起来了解下文字是如何在计算机中存储的。

说到文字,我们通常联想到的是各种各样的字符:中文、英文、日文、韩文等等。除此之外,就是数字了,这里的数字通常就是指全世界通用的阿拉伯数字。

数字编码

为了简单起见,假设我们定义了一个 无符号 的整型: inti=5; 那计算机拿到这个i之后,他是怎么知道这个变量的值是多少的呢?他又是如何存储的呢?

因为计算机是采用的二进制,而十进制的整数要存储时,首先要先转换成二进制。那么自然而然的就得到了数字编码的过程是:

十进制数字--->二进制数字

例如:数字 5 ,在计算机中的形态就是: 00000101。

上面说的是 无符号 的情况, 有符号 的情况更为复杂一些,二进制数字的最高位用作符号位。这时就涉及到另外一种情况了,即:原码,反码和补码。

正数的原码=反码=补码

负数的补码=反码+1

因为用补码存储时既能保证整数又能保证负数的值,所以计算机内部实际是用补码来表示一个数字的。

字符编码

数字编码比较简单,直接将十进制转换成二进制就可以了。但是字符就做不到了,但是我们可以把字符也想象成是一个虚拟的数字,然后再把这个虚拟的数字转换成二进制,不就可以让计算机去处理了吗?

所以字符编码的过程是:

字符------>虚拟数字	
虚拟数字--->二进制数字

那怎么确定字符和虚拟数字之间的关系呢?其实这就是一个 编码 的过程,将每一个单独的字符映射为一个虚拟的数字。当我们把字符映射为数字之后,我们就得到了一个 字符集(Character Set) 。

我们可以这个字符集想象为一个包含字符与数字之间映射关系的表,这个表有一个名字,叫做 CodePage(码表) ,表中的每一个数字叫做 CodePoint(码点) ,但是这个码点并不是最小的单元,他可能是由一个或多个 CodeUnit(码元) 所组成的。

此外,字符集和字符编码是两个不同的概念,大家需要注意区分,举一个比较容易理解的例子,字符集相当于接口,字符编码相当于实现类。

640?wx_fmt=png

ASCII字符集

因为计算机是美国人发明的,最初设计的码表叫ASCII表。ASCII是American Standard Code for Information Interchange的缩写,他是美国人制定的一套字符编码方案。因为英文中只有52个字母(区分大小写),再加上数字和一些特殊符号和控制字符,总的来说需要编码的字符很少,所以最初的ASCII表中只有128个码点。具体的码表如下图所示:

640?wx_fmt=png

PS:ASCII表中的数字0-9是字符形式的数字,即:"1","2"..."9",和数字的1,2…9是不一样的。

ASCII表中的"1",对应十进制的数字是:49,转换成二进制是 00110001

EASCII字符集

计算机普及后,除了美国人使用之外,很多其他国家的人也开始使用起来。但是原本的ASCII码表已经太小了,所以需要重新找一张大表。最初的ASCII表中只用了一个字节中的7位,最高位是没有使用的,如果把最高位也利用起来的话,就可以多出来128个字符。后来,用人真的把这剩下的128个字符利用了起来,解决了部分西欧语言中的字符的映射。因为这个表是在ASCII表的基础上扩展出来的,所以被称为 EASCII字符集 ,我们经常看到的 ISO 8859-1 的编码方式就是 EASCII字符集 的一种实现。

GB XX字符集

再到后来,计算机传到中国之后,在ASCII码表的基础上,即便预留了128个码点可供选择,重新设计码点。但是对于汉字来说,128实在是太少了,所以我们需要重新造一张表。

GB2312字符集

最先被造出来的表是 GB2312 ,这张表中包含了7445个字符,其中汉字6763个。我们知道一个字节最大表示的范围(不考虑符号位)是0~255,共256个空间,2个字节的最大可表示的范围(不考虑符号位)是0~65535,共65536个空间,显然GB2312用一个字节是表示不全的,至少要用两个字节来表示。

为了与ASCII表兼容,码点在0~127(对应的十六进制是0x00~0x7F)之间的字符与ASCII中保持一致。然后用两个连在一起的字节来表示一个汉字,但是规定第一个字节的范围是0xA1~0xF7,第二个字节的范围是0xA1~0xFE。

说到这里我们就需要了解另外一个概念了: 码元。

首先记住一点:码元是组成码点的最小单位。一个码点可能由一个码元组成,也可能由多个码元组成。这取决于不同的编码方式中对码点值的处理方式,稍后我们将在Unicode字符集的编码实现中具体说明这个问题。

GB2312字符集对应的实现方式就是GB2312编码。

GBK字符集

由于GB2312字符集,只收录了6763个汉字,还有好多汉字并未收录,于是微软基于GB2312扩展出了GBK字符集。GBK字符集也是采用的两个字节,第一个字节在0x81~0xFE之间,第二个字节在0x40~0xFE之间,一共收录了两万多个码点,其中汉字有21003个,GBK与GB2312完全兼容。

GBK字符集对应的实现方式就是GBK编码。

GB18030字符集

GB18030字符集与GB2312和GBK基本兼容,但是不同的是GB18030采用变长字节的编码方式,这一点与UTF-8相同。

  • 单字节,从0到0x7F,与ASCII字符集兼容

  • 双字节,第一个字节范围是0x81~0xFE,第二个字节范围是0x40~0xFE,与GBK字符集兼容

  • 四字节,第一个字节范围是0x81~0xFE,第二个字节范围是0x30~0x39,第三个字节范围是0x81~0xFE,第四个字节范围是0x30~0x39

GB18030共收录了70244个汉字。

Unicode字符集

从ASCII字符集开始,后面由不同国家陆续推出了很多不同的字符集,也有各种各样的编码方案。但是,这带来另外一个问题,张三用A字符集编码的结果,李四用B字符集可能解码出来就会出现乱码了,甚至根本解码不出来。因为他们两个所用的码表是不一样的,码点也可能不一样,即便运气好,找到了相同的码点,也有可能解码出来是不同的字符。

那为了解决这种问题,我们就需要一个全世界都认同的大而全的码表,于是Unicode字符集就应运而生了。

由于Unicode字符集太大了,一下子管理不过来,所以在目前Unicode标准中,将字符按照一定的类别划分到0~16这17个平面(Plane层面)中,每个平面中拥有2^16 = 65536个码点。所以,目前Unicode字符集所拥有的码点总数为17*65536=1114112。

Unicode的平面划分,如下图所示:

640?wx_fmt=png

Unicode的码点非常多,但是每个码点最少也需要4个字节,那和传统的ASCII码表就存在不兼容的问题了, 除此以外,如果每个码点都用4个字节来表示的话,就会造成空间的浪费。

UTF-XX编码

为了解决这些问题,就出现了 UTF-XX 这些编码方式,即Unicode码点转换方式(Unicode Transformation Format),一共有三种UTF编码方式,分别是:

  • UTF-8(8-bit Unicode/UCS Transformation Format)

  • UTF-16(16-bit Unicode/UCS Transformation Format)

  • UTF-32(32-bit Unicode/UCS Transformation Format)

其中最简单粗暴的就是UTF-32编码方式,他直接用4个字节来编码每个码点。而UTF-16是用2个字节或4个字节来表示码点的,这将取决于码点在Unicode中哪个Plane中,如果码点在最基本的BMP平面中,那么UTF-16将使用2个字节来编码,否则将使用4个字节来编码。最复杂,最灵活,用的最多的就是UTF-8编码方式了。他可以根据码点的范围使用1到4个字节来编码。

码元和码点

前面我们已经知道了,码点是由一个或多个码元组成的,我们用一个简单的例子来了解下。

640?wx_fmt=png

上图中每一个方框内的都是一个字符,字符下方的是该字符对应的 码点 ,用竖线分隔出来的每个独立的部分是该码点所对应的 码元 。

  • UTF-32

最简单的就是UTF-32编码方式,他是定长字节的,每个字符都是4个字节,这种方式下的码元是4字节的,每个码点由1个码元组成,并且码点是定长字节的。那么4个字节的码元就可能存在字节序的问题,例如 000003A9 变换字节序之后可能就变成了: 03A90000 ,这时解码就会出现问题。

  • UTF-16

UTF-16编码方式是变长字节的,可以看到有的码点只需要2个字节,有的码点需要4个字节。这种方式下码元是2字节的,每个码点可能由1个码元组成,也可能由2个码元组成,但是不管由几个码元组成,也都会出现字节序的问题。

  • UTF-8

UTF-8编码方式也是变长字节的,从1个字节到4个字节都有,但是他的码元是1个字节。也就意味着UTF-8编码方式不需要考虑字节序的问题。

640?wx_fmt=png

PS:好多人说Unicode编码,这种说法是不准确的,Unicode只是一个字符集,UTF-XX才是他具体的编码方式的实现,不过目前说Unicode编码的说法比较多,通常都把他默认为是UTF-16编码。

字节序

由于UTF-16是2字节码元,一个码点是由两个字节组成的,所以就存在字节序的问题。为了解决这个问题,Unicode规范中引入了一个叫BOM(Byte Order Mark)的东西,即指定这种编码使用哪种字节序来编码,一共有两种BOM:BE和LE,即我们所熟悉的大端序和小端序。

  • 大端序:高位字节在前,低位字节在后

  • 小端序:低位字节在前,高位字节在后

举个例子,汉字“语”用UTF-16编码,大端序的结果是: 8A9E ,小端序的结果是: 9E8A

为什么会有字节序这种奇怪的问题存在呢?这跟计算机的实现有关,我们人类阅读的习惯是大端序的,但是计算机先处理低位字节再处理高位字节时效率比较高,所以计算机更喜欢小端序。

640?wx_fmt=png

java中的编码

java中用来存储字符的类型有char和String,java规范中指出,char是由UTF-16编码格式的二字节码元来存储字符的。一个char占2个字节,即一个码元的大小,那么对于那些需要2个以上的字节存储的字符,是不能用char来保存的。String也是使用的UTF-16编码方式进行存储数据的,String可以用char[]数组进行存储,也可以用byte[]数组进行存储,这取决于字符串内字符的编码范围。

在Sun JDK6中有一个“压缩字符串”(-XX:+UseCompressedString)的功能。启用后,String内部存储字符串内容可能用byte[],也可能用char[]。当整个字符串所有字符都在ASCII编码范围内时,就使用byte[]来存储,此时字符串就处于“压缩”状态;反之,只要有任何一个字符超出了ASCII的编码范围,就退回到用char[]来存储。

下面我们来用一个简单的例子来看java中的字符编码,具体的代码如下:

private static String getHex(String str, Charset charset){	
    byte[] bytes = str.getBytes(charset);	
    StringBuilder sb = new StringBuilder();	
    for(int i=0,s=bytes.length;i<s;i++){	
        byte b = bytes[i];	
        sb.append(byte2Hex(b));	
        if(i<s-1){	
            sb.append(" ");	
        }	
    }	
    return sb.toString();	
}	
private static String byte2Hex(byte b){	
    // byte(8位)转int(32位)时,高24位会被自动补齐1,而byte原本高24位是0,	
    // 补齐之后二进制的补码值就变了,为了保持byte的值不变,与上0xff,	
    // 这样高24位变为0,低8位保持不变	
    String hexStr = Integer.toHexString(b & 0xff);	
    if(hexStr.length()==1){	
        hexStr = "0"+hexStr;	
    }	
    return hexStr;	
}	
private static void encode(){	
    // 编码的过程	
    String cn = "语";	
    String en = "A";	
    System.out.println(cn+"--encode with ASCII=======>"+getHex(cn,US_ASCII)); 	
    System.out.println(en+"--encode with ASCII=======>"+getHex(en,US_ASCII));	
    System.out.println(cn+"--encode with UTF-8=======>"+getHex(cn,UTF_8));	
    System.out.println(cn+"--encode with UTF-16======>"+getHex(cn,UTF_16)); 	
    System.out.println(cn+"--encode with UTF-32======>"+getHex(cn,UTF_32));	
}

上面的 encode 方法先执行 String.getBytes() 来获取字符串的字节数组,然后转成十六进制的结果输出。执行完将打印出下面的信息:

语--encode with ASCII=======>3f	
A--encode with ASCII=======>41	
语--encode with UTF-8=======>e8 af ad	
语--encode with UTF-16======>fe ff 8b ed	
语--encode with UTF-32======>00 00 8b ed

首先我们需要知道 String.getBytes() 方法是获取指定字符的 外码 的过程,说到 外码 ,就需要知道与他对应的内码 。内码 是char或String在内存中存储时采用的编码方式,而 外码 则是字符在文件中存储,网络中传输时采用的编码方式。

第一行打印出来的 3f ,表示字符 ”语“ 在ASCII码表中没有找到对应的码点,所以编码的结果是返回了一个 ?。

第二行打印出来的 41 ,就是字符 ”A“ 在ASCII码表中的码点,转换成十六进制后的结果。

第三行打印了三个字节,这与汉字 ”语“ 在UTF-8下的编码方式相符。

第四行就比较奇怪了,按照UTF-16编码方式,”语“ 的编码结果应该是 8b4d ,开头多出来的两个字节是什么情况呢?

其实上面,我们已经了解到UTF-16编码方式会有字节序的问题,如果不指定字节序的话,UTF-16编码会在结果的字节流开头加上两个字节表示字节序: fe ff 表示大端序, ff fe 表示小端序。

第五行打印的也和预期相符。

如果我们指定UTF-16编码的字节序,那么输出的结果就不会再多出两个用来表示字节序的字节了,如下代码所示:

private static void encode(){	
    // 编码的过程	
    String cn = "语";	
    String en = "A";	
    System.out.println(cn+"--encode with UTF-16BE====>"+getHex(cn,UTF_16BE));	
    System.out.println(cn+"--encode with UTF-16LE====>"+getHex(cn,UTF_16LE));	
}

执行完之后,打印出如下的结果:

语--encode with UTF-16BE====>8b ed	
语--encode with UTF-16LE====>ed 8b

乱码

private static void decode(){	
    // 解码的过程	
    String cn = "语";	
    String en = "A";	
    byte[] cnUtf8Bytes = cn.getBytes(UTF_8);	
    byte[] cnUtf16Bytes = cn.getBytes(UTF_16);	
    System.out.println(cn+"--encode with UTF-8,decode with UTF-8========>"+new String(cnUtf8Bytes,UTF_8));	
    System.out.println(cn+"--encode with UTF-8,decode with UTF-16=======>"+new String(cnUtf8Bytes,UTF_16));	
    System.out.println(cn+"--encode with UTF-8,decode with UTF-16BE=====>"+new String(cnUtf8Bytes,UTF_16BE));	
    System.out.println(cn+"--encode with UTF-8,decode with UTF-16LE=====>"+new String(cnUtf8Bytes,UTF_16LE));	
    System.out.println(cn+"--encode with UTF-16,decode with UTF-8=======>"+new String(cnUtf16Bytes,UTF_8));	
    System.out.println(cn+"--encode with UTF-16,decode with UTF-16======>"+new String(cnUtf16Bytes,UTF_16));	
    System.out.println(cn+"--encode with UTF-16,decode with UTF-16BE====>"+new String(cnUtf16Bytes,UTF_16BE));	
    System.out.println(cn+"--encode with UTF-16,decode with UTF-16LE====>"+new String(cnUtf16Bytes,UTF_16LE));	
    byte[] enUtf8Bytes = en.getBytes(UTF_8);	
    byte[] enUtf16Bytes = en.getBytes(UTF_16);	
    System.out.println(en+"--encode with UTF-8,decode with UTF-8========>"+new String(enUtf8Bytes,UTF_8));	
    System.out.println(en+"--encode with UTF-8,decode with UTF-16=======>"+new String(enUtf8Bytes,UTF_16));	
    System.out.println(en+"--encode with UTF-8,decode with UTF-16BE=====>"+new String(enUtf8Bytes,UTF_16BE));	
    System.out.println(en+"--encode with UTF-8,decode with UTF-16LE=====>"+new String(enUtf8Bytes,UTF_16LE));	
    System.out.println(en+"--encode with UTF-16,decode with UTF-8=======>"+new String(enUtf16Bytes,UTF_8));	
    System.out.println(en+"--encode with UTF-16,decode with UTF-16======>"+new String(enUtf16Bytes,UTF_16));	
    System.out.println(en+"--encode with UTF-16,decode with UTF-16BE====>"+new String(enUtf16Bytes,UTF_16BE));	
    System.out.println(en+"--encode with UTF-16,decode with UTF-16LE====>"+new String(enUtf16Bytes,UTF_16LE));	
}

执行完,将打印出如下结果:

语--encode with UTF-8,decode with UTF-8========>语	
语--encode with UTF-8,decode with UTF-16=======>�	
语--encode with UTF-8,decode with UTF-16BE=====>�	
语--encode with UTF-8,decode with UTF-16LE=====>꿨�	
语--encode with UTF-16,decode with UTF-8=======>����	
语--encode with UTF-16,decode with UTF-16======>语	
语--encode with UTF-16,decode with UTF-16BE====>语	
语--encode with UTF-16,decode with UTF-16LE====>�	
A--encode with UTF-8,decode with UTF-8========>A	
A--encode with UTF-8,decode with UTF-16=======>�	
A--encode with UTF-8,decode with UTF-16BE=====>�	
A--encode with UTF-8,decode with UTF-16LE=====>�	
A--encode with UTF-16,decode with UTF-8=======>��A	
A--encode with UTF-16,decode with UTF-16======>A	
A--encode with UTF-16,decode with UTF-16BE====>A	
A--encode with UTF-16,decode with UTF-16LE====>�䄀

可以看到,用一种编码方式编码出来的结果,用另一种编码方式去解码,就会出现乱码的情况。甚至用相同的编码方式,解码时指定的字节序不同也会出现乱码的情况。

实用工具介绍

我们在处理自定义协议,或者抓包到一段报文时,常常需要进行协议的解析,而这时通常需要进行字符的解码。但是码流是用什么格式编码的我们是不知道的,为此笔者自己写了一个实用的工具,可以将一段字符编码成不同格式,也可以将一段码流用不同的编码方式进行解码。话不多说,直接看图:

Text2Hex

将字符用不同编码方式进行编码,并转成十六进制:

640?wx_fmt=png

Hex2Text

将十六进制的码流用不同的编码方式进行解码:

640?wx_fmt=png

Socket client

一个tcp客户端,连接上服务端后,可以发送数据,并将接收到的结果,转换成十六进制码流,然后自动用不同的编码方式进行解码,一眼就可以看出对方采用的何种编码方式:

640?wx_fmt=png

时间戳转换和md5计算

另外两个常用的工具是时间戳转换和md5计算

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

Unicode字符集与utf-8编码 我们都知道计算存储数据和传输数据都是以二进制的形式,也就是0和1,这是因为0和1刚好对应电路中的高电位和低电位。 计算机中最小的存储单位为字节(byte),最小传输单位是位(bit),一个字节占8位。 既然计算机存储的是二进制数,那么在显示终端上是怎么展示成人类识别的文字或者符号的呢? 我们知道计算机最开始是在美国使用,他们为了解决这个问题,于是想了一个办法,将每一个符号(文字)与一个数值对应,比如英文字母"a",对应数字97,以二进制表示为01100001。而8位共有2的8次方256中排列组合,而英 阅读详情

相关推荐

文字编码的前世今生

文字编码的前世今生 Unicode应用中最容易把人搅晕的就是各种不同的Unicode编码方案,以至于从ASCII及GB2312时代跨入Unicode时代的我,很长时间一直以为Unicode和UTF-8就是同一个东西,这样自然会在Python环境下吃不少亏,多次碰壁后好好阅读学习了很多资料,总算是把文字编码的问题基本弄清楚了,这样一看,其实我们很多程序设计教材在写这个问题的时候都没把这个问题彻底讲清楚,有可能部分作者自己也没有吃透这个问题吧。 下学期的《Python程序设计》课程计划结合自己的新理解改改课件,

weixin_42823361的博客 2088

代码与文字

题图 from unsplash代码与文字做技术的,写代码自然不在话下,但你说写个设计文档、做个技术总结分享什么的,可就把一部分人难倒了,理由是没写过、没思路、写不出来、...

东南草堂 810

文字的编码

这个编码转换用于括号里面是UTF-8编码的,比如利用函数从数据库文件读取数据时,因为sql文件一般是utf-8编码的所以可以用;因为这里是在代码里面直接输入的,所以直接按本地编码来编"中文",如果本地编码不是UTF-8编码,就会变成乱码。936(在winXP/win7/win10右键cmd最上边,有“Properties”/“属性”,打开是下面,win11没有该选项,看不了)表示GBK编码。(2)右键-新建,选择“字符串值”,命名为“autorun”, 点击右击修改,数值数据填写“chcp 65001”

qq_40976629的博客 5433

文字与编码的奥秘

文字的发明 文字是社会发展到一定阶段的产物。原始社会时期,人群、部落之间交流较少,有声语言已能满足需要。后来,随着社会生产的发展,人们的社会交际日趋频繁,而有声语言一发即逝,既不能传诸远方,亦不能留诸异日,用它作为传递思想信息的唯一手段,已越来越不能满足需要了。 在旧石器时代,社会组织和社会关系都很原始、很简单。人类社会的最基本的交际工具语言已经可以满足...

weixin_33786077的博客 767

Unicode编码与字节序的奥秘

本文深入探讨了Unicode编码存储和序列化格式中的关键概念,包括字节序(endianness)、字节顺序标记(BOM)以及UTF-8和UTF-16等不同编码方案的细节。文章通过详尽的分析,解释了这些技术如何影响字符编码的存储和传输,并讨论了它们在实际应用中的重要性。

weixin_31974443的博客 469

编码标准与Unicode的奥秘

本文是对书籍《A Practical Programmer’s Guide to the Encoding Standard》中某些章节内容的总结与思考。介绍了Unicode排序算法、特定语言定制、以及如何处理特定字符集和编码问题。文章深入探讨了与字符编码相关的术语和概念,如定制、电报、排序算法、转录与转写等。

weixin_31974443的博客 282

深入探索:中文字符的编码与转移字符的奥秘

GB2312是中华人民共和国国家标准总局1980年发布的一个简体中文字符集编码标准。它收录了6763个常用汉字和682个非汉字图形字符。

anananajiushiwo的博客 1126

从FPGA工程师视角看CXP-12:如何用Xilinx GTX/GTH收发器搞定一条50Gbps的工业相机数据流?

本文从FPGA工程师视角详细解析了如何利用Xilinx GTX/GTH收发器实现50Gbps的CXP-12工业相机数据流传输。通过协议分析、硬件设计要点和FPGA逻辑实现,帮助开发者高效构建高带宽工业视觉系统,特别适合4K/8K高分辨率图像处理需求。

weixin_42533622的博客 282

编码的奥秘_PDF完整版下载仓库

编码的奥秘_PDF完整版下载仓库 【下载地址】编码的奥秘_PDF完整版下载仓库 探索计算机世界的语言,《编码的奥秘_PDF完整版》为你揭开编码的神秘面纱。本书从基础概念入手,深入剖析数字、文字和图像的编码方式,以及编码在计算机硬件和软件中的广泛应用。无论你是初学者还是技术人员,都能从中获得全新视角。书中还探讨了编码的安全...

gitblog_06767的博客 595

三菱CNC数据采集实战:从环境搭建到代码实现的完整指南

本文提供了一份完整的三菱CNC数据采集实战指南,涵盖从开发环境搭建、核心SDK获取、网络配置到基于C#和A2协议的完整代码实现。文章详细解析了初始化、连接管理、数据获取与展示四大核心模块,并分享了错误处理、性能优化及与MES系统集成的关键技巧,帮助工程师快速构建稳定可靠的工业数据采集系统。

wood5的博客 891

408王道考研【数据结构】思维导图(章节详细可下载xmind文件)

由于图片太多,不一一放上来了,还有部分章节【查找、排序、B树B+树等】在百度网盘,可以关注我的公众号领取【完整的图片+xmind文件】,如想要获取xmind文件的同学可以关注我的个人公众号“小柒很爱喵”,回复“数据结构导图”,可获得以上导图原图和xmind文件(可修改导图内容、查看导图隐藏的笔记与备注,即上图带杠杠的地方是我进一步助于理解的解释)。 希望对你们...

weixin_41950078的博客 7995

对计算机编码的认识 分类: 计算机组成原理 2011...

数学是事实的抽象,那么计算机就是数学的实现的实体。 突然想起计算机编码的问题,从学习计算机编码开始就不是太理解,昨天问了一位老师。好像明白了一些。和大家分享一下, 计算机是0、1的世界。那所有的东东都需要用0、1表示了。 是的,用0、1表示。那么很显然我们就会想到编码,即用不同的0、1 来表示不同的概念。 计算机的编码分为这样几个部分: 1:计算机内部的指令编码 2:对数...

weixin_30246221的博客 166

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 356

火星文:一种特殊的文字编码

火星文是一种特殊的文字编码,也称为奇文,其特点是将常见的文字进行特殊的变体处理,使得原本的文字变得难以辨认,需要特定的解码方法才能阅读。火星文生成器 | 一个覆盖广泛主题工具的高效在线平台(amd794.com)

https://blog.cmdragon.cn/ 991

【agent实战教程】OpenClaw多个agent一文通

一个合格的独立agent,必须具备6个完全独立的专属组件独立组件路径规则核心要求不独立的严重后果唯一agentId配置文件中全局唯一,不能重复,建议用英文+数字,不要有特殊字符agent配置冲突,消息派单错误,会话串线独立工作区(workspace)建议每个agent一个独立文件夹,不要共用人设、记忆、规则混在一起,agent人设崩塌,对话串线独立状态目录(agentDir)固定系统自动生成,绝对禁止多个agent复用同一个agentDir。

海兰 651

1、Ka频段双极化低剖面卫通相控阵天线

设计了双馈口叠层十字缝隙耦合天线,采用“双线极化天线 +旋转馈电 + 移相控制”架构,采用双馈口的叠层十字缝隙耦合天线,并以 2 x2 阵列为主体,旋转排布实现二次圆极化,同时极化可切换,通过多层 PCB 工艺实现天线层、控制/电源层功分网终层、芯片层一体化集成,研制出 64 阵元的圆极化可切换发射天线,测试结果表明:天线工作 频段为 27.5 ~31 GHz,可实现60°扫描,法向轴比

qq_43416206的博客 4371

编码表概述和常见编码表

l编码表 •由字符及其对应的数值组成的一张表 l常见编码表 •ASCII/Unicode 字符集 •ISO-8859-1 •GB2312/GBK/GB18030 •BIG5 •UTF-8 计算机只能识别二进制数据,早期由来是电信号。 为了方便应用计算机,让它可以识别各个国家的文字。 就将各个国家的文字用数字来表示,并一一对应,形成一张表。 ASCII:美国标准

3146

YOLO-World:从入门到实战的多模态目标检测全指南

想象一下,你给模型一张“公园”的图片,再输入文字“红色的郁金香”,它能直接在图中框出所有红色郁金香的位置——这就是多模态目标检测:结合图像视觉信息和文本语义信息,同时完成“是什么”(分类)和“在哪里”(定位)的任务。传统目标检测(如YOLOv5、YOLOv8)只能识别预定义的类别(比如训练时学过“猫”“狗”),但多模态目标检测摆脱了“类别预定义”的限制,只要文本能描述,它就能检测,这就是“开放词汇检测(Open-Vocabulary Detection)”的魅力。

know_F0727的博客 206

一本好书《编码的奥秘》

最近一个偶然的机会,看了几页《编码的奥秘》,才被其通俗的语言、精辟的话道出深奥的知识所折服.。于是赶快到书店购了一书,认真研读。 以下说说此书,该书是大书级人物Charles Petzold的作品。著作有"Programming Windows 95",“对整整一代程序员来说,‘到 Petzold 的书里去查查’早已成了解决 Windows 程序设计问题的法宝”。  这本书是难得的大众化好书,对于

yangyun的专栏 2292

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

关于文字编码

文字编码属于字符编码,这里先阐述一下字符编码的背景知识   编码:编码是将信息从一种形式或格式转换为另一种形式的过程,这里的文字编码是指把字符转换为数字形式(即将字形转换成一个或多个字节来显示)从而便于计算机中存储和使用这些字符的过程。   字符:字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。   字符集:字符集(Character se

pkucat的专栏 3954

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

编码的奥秘txt_编码的奥秘(Charles Petzold著) PDF扫描版[9MB]

编码的奥秘 内容简介:渴望交流是大多数人的天性。在编码的奥秘中,“编码”通常指一种在人和机器之间进行信息转换的系统。换句话说、编码即是交流。有时我们将编码看得很神秘,其实大多数编码并非都是这样。大多数的编码都需要被很好地理解,因为它们是人类交流的基础。在编码的奥秘中,作者Charles Petzold用常见的对象和诸如布莱叶育文、摩尔斯电码之类大家熟悉的语言系统,为那些曾经想知道计算机和其他智能机...

weixin_31062993的博客 984

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

改编码格式_CAD多行文字编码讲解

下面是本公众号文章分类目录,点击标题文字可打开分类文章列表:安装卸载异常、退出文件及输入输出基本操作技巧设置及相关问题界面和显示快捷键视图设置和调整图层管理颜色线型字体、文字样式和文字输入标注、引线和标注样式坐标系、坐标输入定位对象捕捉选择及组二维绘图多段线表格图块、属性块、动态块填充复制粘贴三维建模图形编辑和...

weixin_39977886的博客 2752

文字编码

文字编码

futurerock的专栏 824

常见中文字符编码介绍

中文字符编码是用来表示中文字符的一种方式,常见的中文字符编码包括以下九种:ASCII码、ANSI码、Unicode编码、UTF-8编码、GB2312编码、GBK编码、GB18030、Big5编码和LATIN1编码。

qq_43704127的博客 1万+
上一篇: 文字与编码的奥妙(上篇)
下一篇: 鸿篇巨制 —— LevelDB 的整体架构
码洞
博客等级 码龄10年 41粉丝 137原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值