金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

bigendian和littleendianucs-2littleenddian和ucs-2bige

陈剑飞 2025-11-01 19:18:39

每经编辑|陈彬    

当地时间2025-11-01,gfyuweutrbhedguifhkstebtj,萝莉高潮极品自慰

字节的序曲:初(chu)识Bigendian与(yu)Littleendian的舞(wu)蹈

在(zai)浩瀚的(de)计(ji)算(suan)机(ji)科学(xue)领域(yu),数(shu)据以二进(jin)制的形(xing)式存在(zai),而(er)这些(xie)二进(jin)制数(shu)据又(you)被组织成(cheng)一个(ge)个字节。当(dang)一个(ge)多字节的数(shu)据(ju)(例如一个16位的整数(shu)或一(yi)个(ge)32位的浮点(dian)数)在内存中存(cun)储或(huo)在(zai)网络上传输时(shi),一个至(zhi)关(guan)重要(yao)的(de)问题(ti)便(bian)浮出(chu)水面(mian):这(zhe)些字(zi)节(jie)应该如(ru)何排(pai)列(lie)?是(shi)按(an)照(zhao)我们通(tong)常书写(xie)的顺序(xu),从左(zuo)到右(you),即“大(da)头(tou)”在前(Big-endian),还(hai)是反其道(dao)而行之(zhi),“小头(tou)”在(zai)前(Little-endian)?这便是(shi)我(wo)们今(jin)天要(yao)探(tan)讨的核心(xin)——字节(jie)序(ByteOrder)。

想象(xiang)一下,你(ni)正在(zai)写一(yi)篇(pian)关(guan)于古代(dai)历史的(de)文章,其中(zhong)包(bao)含了很多重要(yao)的(de)日期(qi)和年份。你(ni)希望(wang)将这些信息以(yi)数字(zi)形式(shi)存储在(zai)计算(suan)机(ji)中。假(jia)设一(yi)个年(nian)份是2023。在(zai)计算机(ji)内部,这个(ge)数字(zi)会被(bei)表示成一(yi)串(chuan)二进制位。对(dui)于一个16位(wei)的整(zheng)数(shu)而言,2023会(hui)占(zhan)用两个字(zi)节(jie)。在不(bu)同(tong)的(de)计算机体(ti)系结构中,这两(liang)个字(zi)节的存储顺序可能截然不同(tong)。

Big-endian:庄重(zhong)有(you)序(xu)的“大(da)头”

“Big-endian”(大端序(xu))顾(gu)名思义(yi),是指多字(zi)节(jie)数据的(de)最高(gao)有效(xiao)字(zi)节(MostSignificantByte,MSB)存储在(zai)内存的(de)最(zui)低(di)地(di)址(zhi)处。你(ni)可以(yi)将其理解为一种(zhong)“从左(zuo)到(dao)右”的(de)顺序,就像(xiang)我们阅读(du)文字(zi)一样,最(zui)高(gao)位的(de)数(shu)字或信(xin)息总(zong)是(shi)出(chu)现(xian)在(zai)最前(qian)面。

举个例子,如果我(wo)们要存(cun)储(chu)16位的整数0x1234(其中0x12是高字(zi)节(jie),0x34是低(di)字节),在Big-endian系(xi)统中(zhong),它会(hui)被存储为(wei):

内存地址(zhi)0x1000:0x12(MSB)内存(cun)地址0x1001:0x34(LSB)

这(zhe)种(zhong)存储(chu)方式的优(you)势在(zai)于,当我(wo)们(men)需(xu)要(yao)读取(qu)这(zhe)个多(duo)字(zi)节数据(ju)时,可以(yi)直接从最低地址开始(shi)读(du)取,第一个字(zi)节(jie)就(jiu)是最高(gao)有(you)效字节,无需(xu)进(jin)行额外(wai)的字节重(zhong)组操(cao)作,读(du)取起来(lai)更(geng)加直(zhi)观,也更符(fu)合我们(men)人(ren)类的阅读习(xi)惯(guan)。在网(wang)络协议中(zhong),Big-endian常常(chang)被用(yong)作“网络字节序”,以(yi)确(que)保不(bu)同系统(tong)之间数(shu)据传输的一致(zhi)性(xing)。

例(li)如(ru),TCP/IP协议就(jiu)规定使(shi)用(yong)Big-endian作(zuo)为(wei)网络字节序。

Little-endian:灵活巧(qiao)妙的“小头”

与(yu)Big-endian相(xiang)反,“Little-endian”(小端序(xu))则将(jiang)多字节数(shu)据的最低有效(xiao)字节(LeastSignificantByte,LSB)存(cun)储在内(nei)存的最(zui)低地址(zhi)处(chu)。这(zhe)就(jiu)像是信(xin)息(xi)以(yi)一种(zhong)“从右(you)到左(zuo)”的(de)顺(shun)序排(pai)列,最(zui)低位的数(shu)字或信(xin)息(xi)反而(er)出现在最前(qian)面(mian)。

继(ji)续以存(cun)储16位的整(zheng)数(shu)0x1234为例,在(zai)Little-endian系统中,它的存(cun)储方(fang)式(shi)会变成(cheng):

内存(cun)地(di)址(zhi)0x1000:0x34(LSB)内存(cun)地(di)址(zhi)0x1001:0x12(MSB)

这种(zhong)存储(chu)方式的“好处(chu)”体(ti)现在(zai)某(mou)些(xie)特定的CPU设计和(he)操作(zuo)中,例(li)如,当(dang)进行(xing)字(zi)节级别(bie)的算(suan)术运算时,Little-endian的CPU可(ke)以直接操(cao)作(zuo)最低有效(xiao)字节,而(er)无需(xu)额外的地址偏(pian)移(yi),这(zhe)在某(mou)些情况(kuang)下可(ke)以(yi)提高(gao)效(xiao)率。许多(duo)主流的x86架构处(chu)理器(qi)(例如Intel和AMD的(de)CPU)都采(cai)用(yong)Little-endian字节序(xu)。

字节(jie)序的(de)交汇(hui)与挑战

为什么会有两(liang)种(zhong)不(bu)同(tong)的字(zi)节序呢?这(zhe)主要(yao)源于计算(suan)机(ji)体系结(jie)构设(she)计上的历史选择(ze)和不同的优(you)化策略。没有(you)绝(jue)对的优劣(lie)之分(fen),它们(men)只是(shi)处理(li)多字(zi)节(jie)数据存(cun)储和(he)访(fang)问(wen)的不(bu)同方式。

当数据(ju)需要在不(bu)同字(zi)节序(xu)的系(xi)统(tong)之(zhi)间进行(xing)交换时(shi),问题就(jiu)来(lai)了。如(ru)果你在(zai)一个Little-endian系统(tong)上(shang)创建(jian)一个(ge)数(shu)据(ju),然后将其(qi)发送(song)给一(yi)个Big-endian系(xi)统(tong),接收方会(hui)如(ru)何解(jie)读?它会把(ba)接收到的(de)第一(yi)个(ge)字(zi)节当作最高有效(xiao)字(zi)节,导(dao)致数据(ju)的数值完全(quan)错误(wu)。

反之(zhi)亦然。这就(jiu)好比(bi)两种(zhong)语言(yan)的(de)表(biao)达方(fang)式完(wan)全相(xiang)反,如(ru)果沟通时(shi)不进行“翻(fan)译(yi)”,就(jiu)无法理解对方(fang)的意思。

为(wei)了(le)解决这个问(wen)题,我们(men)需要在数(shu)据(ju)传(chuan)输(shu)前进(jin)行“字(zi)节序(xu)转(zhuan)换(huan)”,即根(gen)据目(mu)标系统(tong)的(de)字节序来调整(zheng)数据的字(zi)节(jie)排(pai)列(lie)顺序。在(zai)网(wang)络编程中,这通常(chang)通过(guo)htons()(hosttonetworkshort)、ntohs()(networktohostshort)等(deng)函数来实(shi)现(xian),它们(men)能(neng)够将主(zhu)机字(zi)节序(xu)(本地(di)系统(tong)的字(zi)节序(xu))转(zhuan)换(huan)为网(wang)络字节序(xu)(通常(chang)是Big-endian),或将(jiang)网(wang)络字(zi)节序(xu)转(zhuan)换(huan)为主(zhu)机字节序(xu)。

理解(jie)Big-endian和(he)Little-endian的区别(bie),对(dui)于(yu)进行底(di)层系统(tong)编(bian)程(cheng)、网(wang)络(luo)通信(xin)、文(wen)件(jian)格(ge)式(shi)解析(xi)等(deng)工(gong)作(zuo)至关(guan)重要(yao)。它能(neng)帮(bang)助我(wo)们(men)诊断由(you)字节(jie)序不(bu)匹(pi)配引起(qi)的数(shu)据(ju)错(cuo)误,并(bing)确(que)保数(shu)据的(de)正(zheng)确传输和解析(xi)。在下一(yi)部分,我们将(jiang)把目光投(tou)向UCS-2编码,并(bing)看(kan)看字节(jie)序在其中(zhong)扮演(yan)着怎(zen)样的(de)角(jiao)色。

UCS-2的世(shi)界:字(zi)节序(xu)的交(jiao)响与(yu)编码的(de)艺(yi)术

在上一(yi)部分(fen),我们(men)深(shen)入(ru)探讨(tao)了Big-endian和(he)Little-endian这两种(zhong)截(jie)然不同的(de)字(zi)节存储(chu)方式(shi)。现(xian)在,让(rang)我(wo)们将(jiang)目(mu)光转向字符编(bian)码(ma)的世(shi)界,特(te)别是UCS-2,并理(li)解(jie)字(zi)节序(xu)在其(qi)中扮演(yan)的(de)关键角色。UCS-2,作为Unicode字符(fu)集(ji)的(de)一(yi)个早期(qi)版本(ben),为(wei)我(wo)们描(miao)绘(hui)了一个(ge)广(guang)阔(kuo)的字符(fu)空间,而(er)其(qi)在(zai)内存中的(de)呈现,又离不开(kai)字节(jie)序的“编(bian)排(pai)”。

UCS-2简(jian)述:超越ASCII的编码

Unicode标(biao)准(zhun)的(de)诞(dan)生(sheng),旨在解(jie)决(jue)传统字(zi)符(fu)编码(ma)(如ASCII)的(de)局限(xian)性,为世界(jie)上(shang)几(ji)乎所(suo)有的(de)字符提供一个统一的(de)编码(ma)空(kong)间。UCS-2是(shi)一种定长(zhang)编码,它使(shi)用两(liang)个字(zi)节(jie)(16位(wei))来表(biao)示(shi)一个字符。理(li)论上(shang),UCS-2可以(yi)表示(shi)$2^{16}=65536$个(ge)不同(tong)的字符(fu)。

这比(bi)ASCII的128个(ge)字符(fu),甚至(zhi)扩展(zhan)ASCII的(de)256个(ge)字符,能(neng)够(gou)涵盖(gai)的(de)语(yu)言和符号(hao)范(fan)围要广(guang)得多(duo)。

例如(ru),英(ying)文字母(mu)'A'在ASCII中表(biao)示(shi)为0x41。在(zai)UCS-2中,它(ta)被(bei)表示(shi)为(wei)0x0041。中文(wen)字(zi)符“你(ni)”在UCS-2中可(ke)能表示为(wei)0x4F60。对于那(na)些需(xu)要(yao)处理(li)多国语言(yan)文(wen)本(ben)的(de)应用程序来(lai)说,UCS-2提(ti)供了(le)一(yi)个便(bian)捷(jie)的解(jie)决方案(an),避免了频繁的(de)字符集转换和(he)乱码的(de)困扰。

字(zi)节(jie)序与(yu)UCS-2的亲密接触

问(wen)题就出在UCS-2使用(yong)的是(shi)两(liang)个(ge)字节(jie)来表示一个字符。当一个字符编(bian)码值,比如0x4F60,需(xu)要存(cun)储在内(nei)存(cun)中(zhong)时(shi),它是0x4F在前(qian),0x60在后(hou)(Big-endian),还是(shi)0x60在前(qian),0x4F在后(Little-endian)呢(ne)?这(zhe)又(you)回到(dao)了我(wo)们(men)熟(shu)悉(xi)的字节序(xu)问题(ti)。

在Big-endian系统(tong)中(zhong),0x4F60会被(bei)存储(chu)为:

内(nei)存(cun)地(di)址0x2000:0x4F(高(gao)字节,MSB)内存(cun)地(di)址0x2001:0x60(低字节,LSB)

在Little-endian系(xi)统中,0x4F60会(hui)被存(cun)储为:

内存(cun)地址0x2000:0x60(低字节(jie),LSB)内存地(di)址0x2001:0x4F(高字节(jie),MSB)

这(zhe)种差异(yi)在文本处(chu)理、文(wen)件(jian)读(du)写以及网络传(chuan)输时(shi)至关重要。如果(guo)你在(zai)一(yi)个Big-endian系(xi)统(tong)上创建一(yi)个UTF-16(UCS-2的(de)一个(ge)超集(ji),用于(yu)表示(shi)Unicode码点在U+FFFF范围(wei)之(zhi)外的字符(fu))文件(jian),并(bing)将(jiang)其传输到Little-endian系统上,如(ru)果接收方不(bu)了(le)解这个文件的(de)字节序(xu),它(ta)读取(qu)到的(de)将是错误(wu)的字符。

BOM(ByteOrderMark):字(zi)节(jie)序的“签(qian)名”

为了解(jie)决UCS-2和(he)UTF-16在(zai)不(bu)同字(zi)节序(xu)系(xi)统(tong)间传(chuan)输(shu)时可能出现(xian)的混(hun)乱(luan),Unicode标准引(yin)入(ru)了一个特殊(shu)的标(biao)记(ji)——字节顺(shun)序标记(ji)(ByteOrderMark,BOM)。BOM是(shi)一(yi)个不可(ke)打(da)印(yin)的字(zi)符(fu),其(qi)Unicode码点(dian)是U+FEFF。

当(dang)这(zhe)个U+FEFF字(zi)符(fu)以Big-endian的形式存(cun)储(chu)时,它会表现(xian)为0xFEFF。当(dang)它以Little-endian的形式存储(chu)时(shi),它会表(biao)现为(wei)0xFFFE。

请注意,0xFFFE并不(bu)是(shi)一(yi)个(ge)有效的Unicode字(zi)符,它(ta)实际(ji)上是0xFEFF在Little-endian系(xi)统(tong)下(xia)的字节颠倒(dao)结果。因(yin)此,当一(yi)个文(wen)本(ben)文(wen)件以UTF-16编(bian)码时(shi),文(wen)件(jian)的开头如(ru)果包含BOM,就(jiu)可以(yi)直接(jie)帮助读取(qu)程序判断(duan)出该(gai)文件的字(zi)节序(xu)。

如果(guo)文件开头是0xFEFF,那(na)么这个(ge)文(wen)件是Big-endian的UTF-16。如果文(wen)件开头是0xFFFE,那么(me)这个文件是Little-endian的(de)UTF-16。

如果(guo)文件开头(tou)既不(bu)是0xFEFF也(ye)不是0xFFFE,那么读取(qu)程序(xu)可能需要(yao)依靠(kao)其他信(xin)息(xi)(例如(ru)文件(jian)扩(kuo)展名或(huo)用(yong)户(hu)指定)来推(tui)断字节(jie)序(xu),或者(zhe)默认使(shi)用(yong)系统(tong)的主机字(zi)节序(xu)。

实际应(ying)用中(zhong)的(de)考(kao)量(liang)

在实际开(kai)发(fa)中,尤(you)其是在(zai)进(jin)行跨(kua)平台(tai)数(shu)据交(jiao)换时(shi),我们必须时(shi)刻(ke)关注(zhu)字节(jie)序问题。

网(wang)络编程(cheng):如前(qian)所(suo)述,网(wang)络协议(yi)通(tong)常采用Big-endian作(zuo)为网(wang)络(luo)字(zi)节序。因此(ci),在(zai)发送多(duo)字节数(shu)据(ju)(如(ru)端(duan)口号(hao)、IP地址、结(jie)构体成员(yuan))之(zhi)前,需(xu)要使(shi)用htons()、htonl()等函(han)数(shu)将其(qi)转换为网(wang)络字(zi)节序;在(zai)接(jie)收到(dao)网(wang)络(luo)数据后,再(zai)使(shi)用ntohs()、ntohl()等(deng)函数将其转(zhuan)换(huan)回(hui)主机(ji)字节序(xu)。

文(wen)件I/O:当(dang)读(du)写包含多(duo)字(zi)节(jie)数据(ju)的二进(jin)制文(wen)件(jian)时(shi),要确保写入和(he)读取的字(zi)节(jie)序(xu)一致(zhi),或(huo)者(zhe)在必要时进行转换。对(dui)于(yu)包含UTF-16编码(ma)的(de)文(wen)本文(wen)件,BOM是一个(ge)非常(chang)重要的指示(shi)器,能够帮助(zhu)程序(xu)正确(que)地解析文(wen)件(jian)内容。

数(shu)据(ju)结构与序列(lie)化:在序列化(将(jiang)内(nei)存中的数(shu)据(ju)结构转(zhuan)换(huan)为(wei)字(zi)节流以便存储或传(chuan)输(shu))和反序(xu)列化(hua)(将(jiang)字(zi)节流恢复(fu)为内(nei)存中(zhong)的数据结构(gou))过(guo)程中(zhong),字(zi)节序的(de)处理是(shi)核(he)心环节(jie)。如(ru)果(guo)序列化(hua)和(he)反序列(lie)化发(fa)生在不(bu)同字节(jie)序的系(xi)统(tong)上,必(bi)须进(jin)行(xing)显式的字节(jie)序转换。

结(jie)语(yu):数(shu)据世界的(de)精确与优雅

Big-endian和(he)Little-endian,以及UCS-2这样(yang)的编码,构(gou)成(cheng)了(le)我们处理(li)数字信息(xi)的基础(chu)。它们看(kan)似是枯(ku)燥的技(ji)术细(xi)节,实(shi)则蕴(yun)含着(zhe)数据在不(bu)同介(jie)质间(jian)传递与存(cun)在的智慧(hui)。理解(jie)字节(jie)序,就(jiu)像掌握了语言(yan)的语(yu)法(fa),能(neng)够帮(bang)助(zhu)我们更精确地表(biao)达(da)和(he)理解信息(xi),避免(mian)误解(jie)和错(cuo)误。

而(er)UCS-2这(zhe)样的编码,则(ze)为我(wo)们打(da)开了(le)沟(gou)通(tong)世(shi)界的(de)窗(chuang)口,让(rang)我(wo)们(men)能够(gou)以(yi)一(yi)种统(tong)一的方式(shi),跨(kua)越语言的界(jie)限。

掌(zhang)握(wo)这些概(gai)念,不(bu)仅能提升(sheng)我(wo)们的(de)技(ji)术(shu)功(gong)底(di),更能让(rang)我们在(zai)数(shu)据世界的(de)海洋(yang)中,以(yi)一种更加(jia)自(zi)信和优(you)雅的姿态,驾驭信息(xi)的(de)潮(chao)汐。每(mei)一次对字节序(xu)的细(xi)致(zhi)考(kao)量,每(mei)一次对字(zi)符编(bian)码的准确运(yun)用,都(dou)是在为(wei)构建(jian)一个(ge)更(geng)互(hu)联、更(geng)互通(tong)的数字世界添砖加瓦。

2025-11-01,西北君君和广东仔christmas,世界经济论坛调查澄清其创始人施瓦布未涉及重大不当行为

1.http色,浙大网新(600797)6月30日股东户数18.67万户,较上期减少15.38%激烈床戏娇喘原声,热搜第一!人社局回应胖东来招聘有犯罪前科人员

图片来源:每经记者 钟乔峰 摄

2.少妇社区+双人互动插画图片视频教程,2025年上半年业绩稳健增长 多业务板块协同发力智能汽车赛道

3.Free 国产天美MD+91猫先生上海英语老师,媒体:多数竞购者对星巴克中国业务的估值约为50亿美元

消防员是肉食系季2接档了吗+tk10岁小孩lvk,张毅:建行锚定“三稳”“三优”“三控”目标不动摇

本月国家机构权威通报引发热议,生物老师用“自己”的繁衍故事

封面图片来源:图片来源:每经记者 名称 摄

如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。

读者热线:4008890008

特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap