barriers / 阅读 / 详情

エンディアン

2023-06-10 08:46:26
共1条回复
我不懂运营

尾序。endian

Big Endian 和 Little Endian [转]

powerpc 发表于 2005-5-5 15:25:00

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是 little endian呢?

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

相关推荐

linux little endian和big endian是什么意思

1.故事的起源 “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。 我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。 2.什么是Big Endian和Little Endian? 在设计计算机系统的时候,有两种处理内存中数据的方法。一种叫为little-endian,存放在内存中最低位的数值是来自数据的最右边部分(也就是数据的最低位部分)。 比如某些文件需要在不同平台处理,或者通过Socket通信。这方面我们可以借助ntohl(), ntohs(), htonl(), and htons()函数进行格式转换, 个人补充:一个操作数作htonl或ntohl结果不一定相同,当机器字节序跟网络字节序刚好是仅仅big endian和little endian的区别时是相同的。 3. 如何理解Big Endian和Little Endian 举个例子: int a = 1; a这个数本身的16进制表示是0x00 00 00 01 在内存中怎么存储呢? 如果你的CPU是intel x86架构的(基本上就是通常我们说的奔腾cpu),那么就是0x01 0x00 0x00 0x00 , 这也就是所谓的little-endian, 低字节存放在内存的低位. 如果你的CPU是老式AMD系列的(很老很老的那种,因为最新的AMD系列已经是x86架构了), 它的字节序就是big-endian, 其内存存储就是 0x00 0x00 0x00 0x01在内存中从高字节开始存放。 现在世界上绝大多数的CPU都是little-endian。 4. 了解big-endian和little-endian有什么作用? 一个重要的作用就是了解在网络上不同的机器间的数据如何传输。 假设我们在网络上有两台机器A和B,
2023-06-10 00:45:591

Big Endian与Little Endian字节存储顺序

不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序。分为小端格式和大端格式(Little-Endian&Big-Endian): 比如0x1234; 低8位是34,高8位是12;如果它们分配的内存其实地址是0x0001, 那么如果是大端存储,那么0x0001内存低位地址存放高位字节12;如果是小端存储,那么0x0001内存低位地址存放低位字节34,0x0002存放12。 据Jargon File记载,endian这个词来源于Jonathan Swift在1726年写的讽刺小说 "Gulliver"s Travels"(《格利佛游记》)。该小说在描述Gulliver畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从大的一端剥开的人Swift就称作Big-Endians,而支持从小的一端剥开的人就称作Little-Endians......(后缀ian表明的就是支持某种观点的人)。 1980年,Danny Cohen在其著名的论文"On Holy Wars and a Plea for Peace"中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做Big-Endians,支持从最低位开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。 little endian和big endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式. 假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为: 需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的. 简单的说,little endian把低字节存放在内存的低位;而big endian将低字节存放在内存的高位. 现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian. 比如: int x, 它的地址为0x100。 那么它占据了内存中的Ox100, 0x101, 0x102, 0x103这四个字节(32位系统,所以int占用4个字节)。 上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。 考虑一个W位的整数。它的各位表达如下: Xw-1, Xw-2, ... , X1, X0,它的 MSB (Most Significant Byte, 最高有效字节)为 Xw-1, Xw-2, ... Xw-8; LSB (Least Significant Byte, 最低有效字节)为 X7,X6,..., X0。 其余的字节位于MSB, LSB之间。 这就引出了大端(Big Endian)与小端(Little Endian)的问题。如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端。 对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定: 对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。(链表可能是个例外, 但链表的地址可看作链表头的地址)。 import java.nio.ByteOrder;
2023-06-10 00:46:071

Big Endian 和 Little Endian的区别

没有区别都是字节序的意思,即字节在电脑中存放时的序列与输入时的序列是先到的在前还是后到的在前。字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
2023-06-10 00:46:142

Big Endian 和 Little Endian的区别

LITTLE-ENDIAN(小字节序、低字节序)。 与之对应的是:BIG-ENDIAN(大字节序、高字节序)a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
2023-06-10 00:46:231

Endianism 和Endians分别是什么意思

"Endian"是“字节存储次序”的意思~"big-endian"是只“一种二进制数据储存和传输格式;位於前面的是最高位位元或位元组”~厄。。只查到了这些~希望能对楼主有帮助呗
2023-06-10 00:46:331

Big Endian 和 Little Endian的区别

区别是:Big Endian可以在最小的地址里存储一系列符号中最重要符号记忆的计算机,根据递减的重要性存储的方法。Little Endian用最小的地址储存最少的重要字节 (而用最大的地址储存最多的重要字节) 的计算机记忆力。在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian格式。在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。如果将一个32位的整数0x12345678(如用UltraEdit打开某个文件看到的第一行头四个字节是:"00000000h:12 34 56 78")存放到一个整型变量(int)中,这个整型变量(文件内容)采用大端或者小端模式在内存中的存储。对于文件内容 0x12345678,把前面("12")的看为高端字节,后面("78")的看为低端字节,那么可以使用"高高低低"(Little Endian),"高低高低"(Big Endian)的口诀。直观的区分,如果发现内存的内容和文件的内容在顺序上以4个字节颠倒,那么他就是Little Edian。实现Big Endian和Little Endian主要是由编译器指定的,通常是在CCFLAG 加参数,如: -DENDIAN_LITTLE,设定编译为小端字节。实际中用Trace 32可以用Memory Dump查看内存内容,和写入文件比较后判断为大端还是小端。如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式。采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将低位存放在低地址。那么该如何判断CPU是大端模式还是小端模式呢?在C语言中,联合体union的存放顺序是所有成员都从低地址开始存放的。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。 具体的代码如下:#include "stdio.h"int main(){ union w { int a; //4 bytes char b; //1 byte } c; c.a=1; if (c.b==1) printf("It is Little_endian!/n"); else printf("It is Big_endian!/n"); return 1;}
2023-06-10 00:46:571

Little-Endian 到底是怎么排序的?

排序只有两种1.从大到小排序,2.从小到大排序。显然这里是从小到大排序(无符号数),从一个二进制数(把16进制装换为二进制数)的最高位一次做减法cmp,再根据标志位c的判断两个数的大小关系,00<0C<F5<FD,应该是印刷错误特殊情况的:1.指针地址的比较,2.数组标度的比较,这两种情况比较的是存放内容的地址大小,所以在没有看到你给的这个结果的问题之前不排除有以上两种特殊情况的可能性
2023-06-10 00:47:063

endian.h这个头文件里面的宏可以直接用么

一般来说类似bits、detail一类的文件夹里都存放的是库头文件所依赖的内部头文件(包含一些平台特定信息、TMP实现等),不要直接使用。
2023-06-10 00:47:472

什么是印第安序? 大、小印第安序是指什么?

听我说,超级无聊,保证一定对有``
2023-06-10 00:48:146

大端的计算机用语

端模式(Endian)的这个词出自JonathanSwift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为BigEndian,从尖头开始将鸡蛋敲开的人被归为LittileEndian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业BigEndian和LittleEndian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本书使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。 ;地址偏移 ;大端模式 ;小端模式 0x00 12(OP0) 78(OP3) 0x01 34(OP1) 56(OP2) 0x02 56(OP2) 34(OP1) 0x03 78(OP3) 12(OP0) 如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。 ;地址偏移 ;大端模式 ;小端模式 0x00 12(OP0) 34(OP1) 0x01 34(OP1) 12(OP0) 由上表所知,采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。因此在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。这一现象为系统的软硬件设计带来了不小的麻烦,这要求系统设计工程师,必须深入理解大端和小端模式的差别。大端与小端模式的差别体现在一个处理器的寄存器,指令集,系统总线等各个层次中。 从软件的角度上,不同端模式的处理器进行数据传递时必须要考虑端模式的不同。如进行网络数据传递时,必须要考虑端模式的转换。有过Socket接口编程经验的程序员一定使用过以下几个函数用于大小端字节序的转换。¨ #define ntohs(n) //16位数据类型网络字节顺序到主机字节顺序的转换¨ #define htons(n) //16位数据类型主机字节顺序到网络字节顺序的转换¨ #define ntohl(n) //32位数据类型网络字节顺序到主机字节顺序的转换¨ #define htonl(n) //32位数据类型主机字节顺序到网络字节顺序的转换其中互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式。大端模式处理器的字节序到网络字节序不需要转换,此时ntohs(n)=n,ntohl =n;而小端模式处理器的字节序到网络字节必须要进行转换,此时ntohs(n) = __swab16(n),ntohl =__swab32(n)。__swab16与__swab32函数定义如下所示。 #define ___swab16(x){__u16 __x = (x);((__u16)((((__u16)(__x) & (__u16)0x00ffU) << 8) |(((__u16)(__x) & (__u16)0xff00U) >> 8)));}#define ___swab32(x){__u32 __x = (x);((__u32)((((__u32)(__x) & (__u32)0x000000ffUL) << 24) |(((__u32)(__x) & (__u32)0x0000ff00UL) << 8) |(((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) |(((__u32)(__x) & (__u32)0xff000000UL) >> 24)));} PowerPC处理器提供了lwbrx,lhbrx,stwbrx,sthbrx四条指令用于处理字节序的转换以优化__swab16和__swap32这类函数。此外PowerPC处理器中的rlwimi指令也可以用来实现__swab16和__swap32这类函数。在LinuxPowerPC中,定义了一系列有关字节序转换的函数,其详细定义在./include/asm-powerpc/byteorder.h文件中。程序员在对普通文件进行处理也需要考虑端模式问题。在大端模式的处理器下对文件的32,16位读写操作所得到的结果与小端模式的处理器不同。读者单纯从软件的角度理解上远远不能真正理解大小端模式的区别。事实上,真正的理解大小端模式的区别,必须要从系统的角度,从指令集,寄存器和数据总线上深入理解,大小端模式的区别。 除了4.2.1节中,软件上对不同端模式编程上的差异,处理器在硬件上也由于端模式问题在设计中有所不同。从系统的角度上看,端模式问题对软件和硬件的设计带来了不同的影响,当一个处理器系统中大小端模式同时存在时,必须要对这些不同端模式的访问进行特殊的处理。PowerPC处理器主导网络市场,可以说绝大多数的通信设备都使用PowerPC处理器进行协议处理和其他控制信息的处理,这也可能也是在网络上的绝大多数协议都采用大端编址方式的原因。因此在有关网络协议的软件设计中,使用小端方式的处理器需要在软件中处理端模式的转变。而Pentium主导个人机市场,因此多数用于个人机的外设都采用小端模式,包括一些在网络设备中使用的PCI总线,Flash等设备,这也要求硬件工程师在硬件设计中注意端模式的转换。本书中的小端外设是指这种外设中的寄存器以小端方式进行存储,如PCI设备的配置空间,NOR FLASH中的寄存器等等。对于有些设备,如DDR颗粒,没有以小端方式存储的寄存器,因此从逻辑上讲并不需要对端模式进行转换。在设计中,只需要将双方数据总线进行一一对应的互连,而不需要进行数据总线的转换。如果从实际应用的角度说,采用小端模式的处理器需要在软件中处理端模式的转换,因为采用小端模式的处理器在与小端外设互连时,不需要任何转换。而采用大端模式的处理器需要在硬件设计时处理端模式的转换。大端模式处理器需要在寄存器,指令集,数据总线及数据总线与小端外设的连接等等多个方面进行处理,以解决与小端外设连接时的端模式转换问题。在寄存器和数据总线的位序定义上,基于大小端模式的处理器有所不同。一个采用大端模式的32位处理器,如基于E500内核的MPC8541,将其寄存器的最高位msb(mostsignificant bit)定义为0,最低位lsb(lease significantbit)定义为31;而小端模式的32位处理器,将其寄存器的最高位定义为31,低位地址定义为0。与此向对应,采用大端模式的32位处理器数据总线的最高位为0,最高位为31;采用小端模式的32位处理器的数据总线的最高位为31,最低位为0。如图4.5所示。 OP0 OP1 OP2 OP3 OP0 OP1 OP2 OP3 31 0 31 0 ;图4.5大小端模式处理器的寄存器的定义 ;大端模式处理器寄存器位序定义 ;小端模式处理器寄存器位序定义 大小端模式处理器外部总线的位序也遵循着同样的规律,根据所采用的数据总线是32位,16位和8位,大小端处理器外部总线的位序有所不同。¨ 大端模式下32位数据总线的msb是第0位,MSB是数据总线的第0~7的字段;而lsb是第31位,LSB是第24~31字段。小端模式下32位总线的msb是第31位,MSB是数据总线的第31~24位,lsb是第0位,LSB是7~0字段。¨ 大端模式下16位数据总线的msb是第0位,MSB是数据总线的第0~7的字段;而lsb是第15位,LSB是第8~15字段。小端模式下16位总线的msb是第15位,MSB是数据总线的第15~7位,lsb是第0位,LSB是7~0字段。¨ 大端模式下8位数据总线的msb是第0位,MSB是数据总线的第0~7的字段;而lsb是第7位,LSB是第0~7字段。小端模式下8位总线的msb是第7位,MSB是数据总线的第7~0位,lsb是第0位,LSB是7~0字段。由上分析,我们可以得知对于8位,16位和32位宽度的数据总线,采用大端模式时数据总线的msb和MSB的位置都不会发生变化,而采用小端模式时数据总线的lsb和LSB位置也不会发生变化。为此,大端模式的处理器对8位,16位和32位的内存访问(包括外设的访问)一般都包含第0~7字段,即MSB。小端模式的处理器对8位,16位和32位的内存访问都包含第7~0位,小端方式的第7~0字段,即LSB。由于大小端处理器的数据总线其8位,16位和32位宽度的数据总线的定义不同,因此需要分别进行讨论在系统级别上如何处理端模式转换。在一个大端处理器系统中,需要处理大端处理器对小端外设的访问。1.1.2.1 大端处理器对32位小端外设进行访问大端处理器采用32位总线与小端外设进行访问时,大端处理器的32位数据总线的第0~7位用来处理OP0,第8~15位用来处理OP1,第16~23位用来处理OP2,第24~31位用来处理OP3。而32位的小端设备使用数据总线的第31~24位用来处理OP0,第23~16位用来处理OP1,第15~8位用来处理OP2,第7~0位用来处理OP3。大端处理器,如MPC8541,使用stw,sth,stb和lwz,lhz,lbz指令对32位的外部设备进行访问。在这些指令结束后,存放在外部设备的数据将被读入MPC8541的通用寄存器中。为保证软件的一致性,当访问结束后,存放在通用寄存器的字节序,即OP0,OP1,OP2和OP3必须要和存放在小端外设的字节序一致。此时在使用大端处理器的数据总线连接小端外设时必须要进行一定的处理,按照某种拓扑结构连接以保证软件的一致性。大端处理器数据总线与小端外设进行连接的拓扑结构如图4.6所示。 OP0 OP1 OP2 OP3 31 31 0 7 8 15 16 23 24 24 23 16 15 8 7 0 ;大端处理器的32位数据总线 ;小端设备的32位总线接口 ;图4.6 大端处理器与小端外设的32位连接 OP0 OP1 OP2 OP3 如图4.6所示,采用大端处理器访问小端设备时,将各自的OP0~OP3字段直接相连。在大端处理器的32位数据总线的最高位为0,最低位为31;而小端设备的最高位为31,最低位为0。因此硬件工程师在进行信号连接时需要将采用大端处理器的0~31位分别与小端设备的31~0位一一对应,进行互连。1.1.2.2 大端处理器对8,16位小端外设进行访问大端处理器使用8位,16位数据总线对8位,16位的小端外设进行连接。对于32位处理器,用来连接外设的总线一般是32位。因此体系结构工程师在进行大端处理器总线设计时有两种选择,是采用32位总线的高端部分(第0~15字段)还是低端部分(第16~31字段)连接小端设备。PowerPC处理器使用32位总线的高端部分,即数据总线的第0~15位连接16位的小端设备,使用0~7位连接8位的小端设备。PowerPC处理器采用16位总线与16位的小端外设进行访问时,PowerPC处理器的16位数据总线的第0~7位用来处理OP0,第8~15位用来处理OP1。而16位的小端设备使用数据总线的第15~8位用来处理OP0,第7~0位用来处理OP1。PowerPC处理器采用8位总线与8位的小端外设进行访问时,PowerPC处理器的8位数据总线的第0~7字段用来处理OP0。而8位的小端设备使用数据总线的第7~0位用来处理OP1。大端处理器与小端外设的连接关系如图4.7所示。 OP0 OP1 OP0 OP1 15 0 7 8 15 8 7 0 ;大端处理器的8/16位数据总线 ;小端设备的8/16位总线接口 ;图4.7 大端处理器与小端外设的8/16位连接 OP0 OP0 7 0 7 0 与32位总线接口类似,PowerPC处理器可以使用stw,sth,stb和lwz,lhz,lbz指令对32位的外部设备进行访问,并将数据存放在相应的通用寄存器中。当访问结束后,存放在通用寄存器的字节序,即OP0,OP1必须要和存放在小端外设的字节序一致。PowerPC处理器对8位的小端外设进行访问时,一个总线周期只能访问8位数据,如果处理器使用stw或者lwz指令访问8位的小端设备内的32位数据时,在数据总线上将OP0,OP1,OP2和OP3依次传递到PowerPC的通用寄存器中。PowerPC处理器对16位的小端外设进行访问时,一个总线周期只能访问16位数据,如果处理器使用stw或者lwz指令访问16位的小端设备内的32位数据时,在数据总线上将OP0~1和OP2~3依次传递到PowerPC的通用寄存器中。PowerPC处理器使用sth或者lhz指令访问16位的小端设备时,16位的小端设备将数据的第15~0位,传递到PowerPC处理器的总线的第0~15位,然后再将数据最终传递给相应的通用寄存器。这里有许多读者会感到困惑,因为为了保证软件的一致性,PowerPC处理器使用lhz指令访问16位的小端设备的16位寄存器时,需要将结果保存在通用寄存器的第16~31位,而不是0~15位。究竟PowerPC处理器是如何将系统总线中0~15位的数据搬移到寄存器的第16~31位中的呢?为此我们需要对lhz指令进行分析。 lhz rD,d(rA)if rA = 0 then b ← 0else b ← (rA)EA ← b + EXTS(d)rD ← (24)0 || MEM(EA,1) 由lhz指令的以上描述得知lhz指令将来自数据总线上的OP0与OP1直接存入寄存器的第16~31位,而将第0~15位直接清零。PowerPC处理器使用stb或者lbz指令访问8位的小端设备时,8位的小端设备将数据的第7~0位,传递到PowerPC处理器的总线的第0~7位,然后再将数据最终传递给相应的通用寄存器,lbz指令的描述如下所示。 lbz rD,d(rA)if rA = 0 then b ← 0else b ← (rA)EA ← b + EXTS(d)rD ← (24)0 || MEM(EA,1) 由lhz指令的以上描述得知lhz指令将来自数据总线上的OP0直接存入寄存器的第24~31位,而将第0~23位清零。文章二:大端(big-endian)和小端(little-endian)<;转>2007-12-07 20:36 ;补:x86机是小端(修改分区表时要注意),单片机一般为大端 今天碰一个关于字节顺序的问题,虽然看起来很简单,但一直都没怎么完全明白这个东西,索性就找了下资料,把它弄清楚. 因为现行的计算机都是以八位一个字节为存储单位,那么一个16位的整数,也就是C语言中的short,在内存中可能有两种存储顺序big-endian和 litte-endian.考虑一个short整数0x3132(0x32是低位,0x31是高位),把它赋值给一个short变量,那么它在内存中的存 ;储可能有如下两种情况:大端字节(Big-endian):----------------->>>>>>>>;内存地址增大方向short变量地址0x1000 0x1001_____________________________| || 0x31 | 0x32|_______________ | ________________高位字节在低位字节的前面,也就是高位在内存地址低的一端.可以这样记住(大端->;高位->;在前->;正常的逻辑顺序)小端字节(little-endian):----------------->>>>>>>>;内存地址增大方向short变量地址0x1000 0x1001_____________________________| || 0x32 | 0x31|________________ | ________________低位字节在高位字节的前面,也就是低位在内存地址低的一端.可以这样记住(小端->;低位->;在前->;与正常逻辑顺序相反)可以做个实验在windows上下如下程序#include <stdio.h>#include <assert.h>void main(void){ short test; FILE* fp; test = 0x3132; //(31ASⅡC码的"1",32ASⅡC码的"2")if ((fp = fopen (c:\test.txt,wb)) == NULL)assert(0); fwrite(&test,sizeof(short),1,fp); fclose(fp);}然后在C盘下打开test.txt文件,可以看见内容是21,而test等于0x3132,可以明显的看出来x86的字节顺序是低位在前.如果我们把这段 ;同样的代码放到(big-endian)的机器上执行,那么打出来的文件就是12.这在本机中使用是没有问题的.但当你把这个文件从一个big- endian机器复制到一个little-endian机器上时就出现问题了.如上述例子,我们在big-endian的机器上创建了这个test文件,把其复制到little-endian的机器上再用fread读到一个 short里面,我们得到的就不再是0x3132而是0x3231了,这样读到的数据就是错误的,所以在两个字节顺序不一样的机器上传输数据时需要特别小 ;心字节顺序,理解了字节顺序在可以帮助我们写出移植行更高的代码.正因为有字节顺序的差别,所以在网络传输的时候定义了所有字节顺序相关的数据都使用big-endian,BSD的代码中定义了四个宏来处理:#define ntohs(n) //网络字节顺序到主机字节顺序 n代表net,h代表host,s代表short#define htons(n) //主机字节顺序到网络字节顺序 n代表net,h代表host,s代表short#define ntohl(n) //网络字节顺序到主机字节顺序 n代表net,h代表host,l代表 long#define htonl(n) //主机字节顺序到网络字节顺序 n代表net,h代表host,l代表 long举例说明下这其中一个宏的实现:#define sw16(x) ((short)( (((short)(x) & (short)0x00ffU) << 8) | (((short)(x) & (short)0xff00U) >> 8)))这里实现的是一个交换两个字节顺序.其他几个宏类似.我们改写一下上面的程序#include <stdio.h>#include <assert.h>#define sw16(x) ((short)( (((short)(x) & (short)0x00ffU) << 8) | (((short)(x) & (short)0xff00U) >> 8)))// 因为x86下面是低位在前,需要交换一下变成网络字节顺序#define htons(x) sw16(x)void main(void){ short test; FILE* fp;test = htons(0x3132); //(31ASⅡC码的"1",32ASⅡC码的"2") if ((fp = fopen (c:\test.txt,wb)) == NULL)assert(0); fwrite(&test,sizeof(short),1,fp); fclose(fp);}如果在高字节在前的机器上,由于与网络字节顺序一致,所以我们什么都不干就可以了,只需要把#define htons(x) sw16(x)宏替换为 #define htons(x) (x).一开始我在理解这个问题时,总在想为什么其他数据不用交换字节顺序?比如说我们write一块buffer到文件,最后终于想明白了,因为都是unsigned char类型一个字节一个字节的写进去,这个顺序是固定的,不存在字节顺序的问题,够笨啊.. 文章三:big-endian和little-endian这两个术语来自Jonathan Swift在十八世纪的嘲讽作品Gulliver"s Travels。Blefuscu帝国的国民被根据吃鸡蛋的方式划分为两个部分:一部分在吃鸡蛋的时候从鸡蛋的大端(bigend)开始,而另一部分则从鸡蛋的小端(little end)开始。x86的CPU使用的是LE(Windows中称为“主机字节序”),而SocksAddr中使用的则是BE(就是“网络字节序”),所以在使用网络编程时需要使用htns,htnl,nths,nthl来倒字节序。其实对汇编熟了就清楚了,惨,我的汇编很惨的LE little-endian 最符合人的思维的字节序 地址低位存储值的低位 地址高位存储值的高位 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说 低位值小,就应该放在内存地址小的地方,也即内存地址低位 反之,高位值就应该放在内存地址大的地方,也即内存地址高位 BE big-endian 最直观的字节序 地址低位存储值的高位 地址高位存储值的低位 为什么说直观,不要考虑对应关系 只需要把内存地址从左到右按照由低到高的顺序写出 把值按照通常的高位到低位的顺序写出 两者对照,一个字节一个字节的填充进去 例子:在内存中双字0x01020304(DWORD)的存储方式 内存地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04 MSDN中关于LE和BE的解释Byte Ordering Byte ordering Meaning big-endian The most significant byte is on the left end of a word. little-endian The most significant byte is on the right end of a word. 这里这个最重要的字节可以解释成值的最高位,如果换成是钱的话就是最值钱的那一位 比如我有1234元人民币,最值钱的是1000元,最不值钱的是4元,那么这个1就是最重要的字节Big endian machine: It thinks the first byte it reads is the biggest.Little endian machine: It thinks the first byte it reads is the littlest.举个例子,从内存地址0x0000开始有以下数据0x0000 0x120x0001 0x340x0002 0xab0x0003 0xcd如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为0xcdab3412.如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为 big-endian little-endian0x0000 0x12 0xcd0x0001 0x23 0xab0x0002 0xab 0x340x0003 0xcd 0x12x86系列CPU都是little-endian的字节序。
2023-06-10 00:49:241

CPU是Little endian还是Big endian模式

对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。Big: 从内存地址的低到高位保存数据的从高到底位Little:从内存地址的低到高位保存数据的从低到高位内存内容如下:0x00000x00010x00020x00030x120x230xab0xcd 如果是big:读出来的内容是0x1234abcd,如果是little读出来的内容是0xcdab3412 把0x1234abcd写入:内存地质0x00000x00010x00020x0003Big0x120x230xab0xcdLittle0xcd0xab0x340x12 一般来说,x86系列CPU都是little-endian的字节序,PowerPC通常是Big endian,还有的CPU能通过跳线来设置CPU工作于Little endian还是Big endian模式。 解答这个问题的方法只能是将一个字节(CHAR/BYTE类型)的数据和一个整型数据存放于同样的内存开始地址,通过读取整型数据,分析CHAR/BYTE数据在整型数据的高位还是低位来判断CPU工作于Little endian还是Big endian模式。得出如下的答案:typedef unsigned char BYTE;int main(int argc, char* argv[]){ unsigned int num,*p; p = &num; num = 0; *(BYTE *)p = 0xff; if(num == 0xff) { printf("The endian of cpu is little "); } else //num == 0xff000000 { printf("The endian of cpu is big "); } return 0;} 除了上述方法(通过指针类型强制转换并对整型数据首字节赋值,判断该赋值赋给了高位还是低位)外,还有没有更好的办法呢?我们知道,union的成员本身就被存放在相同的内存空间(共享内存,正是union发挥作用、做贡献的去处),因此,我们可以将一个CHAR/BYTE数据和一个整型数据同时作为一个union的成员,得出如下答案:int checkCPU(){ { union w { int a; char b; } c; c.a = 1; return (c.b == 1); }} 实现同样的功能,我们来看看Linux操作系统中相关的源代码是怎么做的:static union { char c[4]; unsigned long l; } endian_test = { { "l", "?", "?", "b" } };#define ENDIANNESS ((char)endian_test.l)Linux的内核作者们仅仅用一个union变量和一个简单的宏定义就实现了一大段代码同样的功能!
2023-06-10 00:49:591

如何为现有的openwrt编译一个opkg上没有的软件

一、安装编译环境(以ubuntu10.10为例)依次输入以下命令:1.ubuntu开发环境需要的软件:sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawksudo apt-get update2.创建目录mkdir openwrt3.获取OpenWrt源代码和安装包,更新svn checkout svn://svn.openwrt.org/openwrt/backfirecd backfire./scripts/feeds update -a./scripts/feeds install -a4.配置编译选项make menuconfig在target system里选择Broadcom BCM63xx,根据需要选择其他的软件,*:表示该模块直接编译到核心中M:该模块以被核心支持,可以后再安装空白:不支持该模块具体模块的起什么作用需要多google;5.编译选项配置保存后,开始编译make V=99V=99表示输出详细的debug信息;二、编译准备1.下载源文件下载地址:http://ftp.awk.cz/cntlm/ ,最新的版本是0.91rc6;2.获取md5sum码进入下载文件目录,在终端里输入 md5sum cntlm-0.91rc6.tar.gz获得md5验证码:21ccd60294269cb8fbe3e2e49374ab1b3.编写makefile文件在openwrt/backfire目录中的package目录下新建cntlm目录,在cntlm目录下新建文件,命名为makefile,编辑makefile文件,加入如下内容:---------------------------------------------------------------------------------------------------------------------------## Copyright (C) 2006-2008 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#include $(TOPDIR)/rules.mkPKG_NAME:=cntlmPKG_VERSION:=0.91rc6PKG_RELEASE:=1PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gzPKG_SOURCE_URL:=http://ftp.awk.cz/cntlm/PKG_MD5SUM:=21ccd60294269cb8fbe3e2e49374ab1bPKG_INSTALL:=1include $(INCLUDE_DIR)/package.mkdefine Package/cntlm SUBMENU:=Proxy Servers SECTION:=net CATEGORY:=Network TITLE:=Cntlm is a Fast NTLM Authentication Proxy URL:=http://cntlm.sourceforge.net/endefdefine Package/cntlm/install $(INSTALL_DIR) $(1)/usr/sbin $(CP) $(PKG_INSTALL_DIR)/usr/sbin/cntlm $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/usr/share/man/man1 $(CP) $(PKG_INSTALL_DIR)/usr/share/man/man1/$(PKG_NAME).1 $(1)/usr/share/man/man1 $(INSTALL_DIR) $(1)/etc/ $(CP) $(PKG_INSTALL_DIR)/etc/cntlm.conf $(1)/etc/endef$(eval $(call BuildPackage,cntlm))---------------------------------------------------------------------------------------------------------------------------4.编写patch文件由于BCM63xx核心是big endian,而我们常用的intel或AMD的cpu都是little endian的,cntlm虽然能够自己检测编译环境的endian,但我们是在交叉编译环境中编译,cntlm检测出来的还是ubuntu系统的endian,因此需要设置手动endian为big endian。具体就是将源码文件中的config/endian.c文件的rc设定为0.将源码文件中的endian.c文件分别复制到a目录下的config目录和b目录下的config目录,打开b目录下的config目录中的endian.c文件,并将其修改为:-------------------------------------------------------------------------------------------------------------------------#include #include int main(int argc, char **argv) { int rc; rc = 0; printf("%s ", rc ? "little endian" : "big endian"); return rc;}---------------------------------------------------------------------------------------------------------------------------然后保存。运行:diff -Naur a/config/endian.c b/config/endian.c >endian.patchendian.patch文件内容如下:------------------------------------------------------------------------------------------------------------------------------ a/config/endian.c 2007-08-20 07:23:17.000000000 +0800+++ b/config/endian.c 2010-11-01 18:36:32.000000000 +0800@@ -1,15 +1,11 @@#include #include -uint8_t num[] = { 0xEF, 0xBE };-/*- * RC: 1 = LE, 0 = BE- */int main(int argc, char **argv) { int rc;- rc = (*((uint16_t *)num) == 0xBEEF);+ rc = 0; printf("%s ", rc ? "little endian" : "big endian"); return rc;---------------------------------------------------------------------------------------------------------------------------将endian.patch文件复制到package/cntlm/patches/目录下(没有patches目录就新建一个)。三、编译1.选定安装包终端输入:make menuconfig在Network——》Proxy Severs中选择cntlm;2.开始编译终端输入:make package/cntlm/compile V=99中间可能会出现一些提示(Note),可以不用理会。编译完成后在bin/packages目录下可以看到cntlm_0.91rc6-1_brcm63xx.ipk文件啦。四、补充上面提到在编译过程中出会现提示(Note),一般如下:utils.c:1: note: someone does not honour COPTS correctly, passed 0 times这是由于cntlm源码文件中CFLAG的设置是覆盖而不是续接,与openwrt要求不同,在openwrt一般写成CFLAG += 的方式。可以通过如下修改去除note:将源码包中的Makefile文件复制到a目录和b目录,打开b目录下的Makefile文件,作如下修改:CFLAGS+=$(FLAGS)即增加上面的“+”号,保存。运行:diff -Naur a/Makefile b/Makefile > makefile.patch得到的makefile.patch文件如下:------------------------------------------------------------------------------------------------------------------------------ a/Makefile 2010-04-29 19:18:58.000000000 +0800+++ b/Makefile 2010-11-09 20:17:33.405177000 +0800@@ -16,7 +16,7 @@CC=gccVER=`cat VERSION`OBJS=utils.o ntlm.o xcrypt.o config.o socket.o acl.o auth.o http.o forward.o direct.o scanner.o pages.o main.o-CFLAGS=$(FLAGS) -std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE -D_REENTRANT -DVERSION="`cat VERSION`" -g+CFLAGS+=$(FLAGS) -std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE -D_REENTRANT -DVERSION="`cat VERSION`" -gOS=$(shell uname -s)OSLDFLAGS=$(shell [ $(OS) = "SunOS" ] && echo "-lrt -lsocket -lnsl")LDFLAGS:=-lpthread $(OSLDFLAGS)---------------------------------------------------------------------------------------------------------------------------将makefile.patch文件复制到package/cntlm/patches目录下,重新编译即可。
2023-06-10 00:50:131

高位优先(big—endian)与低位优先(little-endian)的计算机有什么区别?拜托了各位 谢谢

高位优先与低位优先的区别仅仅在于一个字的哪一端是高位字节。换句话说,两者的区别在于你是喜欢从左向右数,还是喜欢从右向左数。但是,哪种方式都不见得比另一种方式更好。一个可移植的C程序必须能同时适用于这两种类型的计算机。 假设你的程序运行在short类型为两字节长的计算机上,并且把值258(十进制)存放到地址s3000H处的一个short类型中。因为short类型的长度为两字节,所以该值的一个字节存放在3000H处,另一个字节存放在3001H处。258(十进制)即0102H,所以该值的一个字节的内容为1,另一个字节的内容为2。那么,究竟内容为1和2的字节分别是哪一个呢? 其答案因机器的不同而不同。在高位优先的计算机上,高位字节就是低地址字节(“高位字节”指的是其值变化后使整个字的值变化最大的那个字节,例如,在值0102H中,01H就是高位字节,而02H是低位字节)。在高位优先的计算机上,字节中的内容如下所示: 地址2FFEH 2FFFH 3000H 3001H 3002H 3003H 值01H 02H 这种图示方式很直观——地址就象是尺子上的刻度值,低地址在左,高地址在右。在低位优先的计算机上,字节中的内容如下所示: 地址3003H 3002H 3001H 3000H 2FFFH 2FFEH 值01H 02H 这种图示方式同样很直观——低位字节存放在低地址中。 不幸的是,有些计算机采用高位优先的存储方式,而另一些计算机却采用低位优先的存储方式。例如,IBM兼容机和Macintosh机对高位字节和低位字节的处理方法就不同。 为什么这种区别会产生影响呢?试想一下,如果用fwrite()直接把一个short类型的值按两字节存到文件或网络上,不考虑格式和是否可读,而只是存为紧凑的二进制形式,会引起什么后果呢?如果在高位优先的计算机上存入这个值,而在低位优先的计算机上读出该值(或者反过来),那么存入的是0102H(258),读出的就是0201H(513)。 解决这个问题的办法是选择一种存储(和读取)方式,并且自始至终使用这种方式,而不是按存入内存的方式来存储short或int类型的值。例如,有些标准指定了“网络字节顺序(network byte order)”,它是一种高位优先顺序(即高位字节存放在低地址中)。例如,如果s是一个short类型值而a是一个由两个char类型组成的数组,那么下面这段代码 a[0]=(s>>4)& Oxf; a[1]=s&0xf; 将把s的值按网络字节顺序存入a的两个字节中。不管程序是运行在高位优先或低位优先的计算机上,s的值都会存成这种形式。 你可能会注意到,笔者一直没有提到哪种计算机是高位优先或低位优先的计算机。这样做是有目的的——如果可移植性是重要的,你就应该按这两种类型的计算机都能接受的方式编写程序;如果效率是重要的,通常你仍然要按这两种类型的计算机都能接受的方式编写程序。 例如,在高位优先的计算机上可以用一种更好的方法去实现上例中的那段代码,即使你使用了上例中的代码,一个好的编译程序仍然会利用那种更好的实现来产生机器代码。 注意:“big-endian"和"little-endian"这两个名称来源于Jonathan Swift所写的《格列佛游记>>(Gulliver"s Travels)一书。在格列佛第三次出海时,他遇到了这样一群人,他们对煮熟了的鸡蛋的吃法争论不休:有的要先吃大头,有的要先吃小头。 “网络字节顺序”只适用于int,short和long类型。char类型的值按定义只有一字节长,因此字节顺序与它无关。对于float和double类型的值,没有一种标准的存储方式。
2023-06-10 00:50:231

little-endian中文是什么意思

little-endian[英] ["lu026atl"endu026au0259n][美] ["lu026atl"endu026arn][词典][计]一种存放二进制数据的格式;[例句]Because x86 CPUs are little-endian, the value0x0042 is stored in memory as4200.因为x86CPU是little-endian,值0x0042在内存中的存储形式是4200。
2023-06-10 00:50:331

求靠谱的Big Endian整型转Little Endian整型的C语言代码?

利用联合体交换字节次序。big 进 little出, little 进 big 出。程序一样。typedef union {unsigned char s[2];short int x;} U16;typedef union {unsigned char s[4];long int x;} U32;short int i16(short int x){U16 u;unsigned char t;u.x = x;t = u.s[0]; u.s[0]=u.s[1]; u.s[1]=t;return u.x;}long int i32(long int x){U32 u;unsigned char t;u.x = x;t = u.s[0]; u.s[0]=u.s[3]; u.s[3]=t;t = u.s[1]; u.s[1]=u.s[2]; u.s[2]=t;return u.x;}16 位的 调这个:short int i16(short int x)32位的 调: long int i32(long int x)
2023-06-10 00:50:401

编码方式是什么?

编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式
2023-06-10 00:50:491

关于c++中二进制读取的问题,为啥输出不是1

逆向你的结果808464432 -> in.dat前4个字节为0x30303030得出你in.dat的ASCII前4个字符内容为"0000"这和你描述的一致
2023-06-10 00:50:563

高位在前低位在后的编码类型叫什么

高位在前低位在后的编码类型叫Bigendian。根据查询相关信息显示,Bigendian,大端序。编码顺序,高位在前,低位在后。Littleendian,小端序。编码顺序,低位在前,高位在后。
2023-06-10 00:51:041

idea的加密是什么机制?

分类: 电脑/网络 >> 反病毒 问题描述: 我只知道他是对称加密方式,对64位数据产生128位的密钥。 请说点其他的。 解析: IDEA加密标准由PGP(Pretty Good Privacy)系统使用。公共密钥加密使用两个不同的密钥, 因此是一种不对称的加密系统。它的一个密钥是公开的, 而系统的基本功能也是有公共密钥的人可以访问的, 公共密钥可以保存在系统目录内或保存在未加密的电子邮件信息中。它的另一个密钥是专用的, 它用来加密信息但公共密钥可以解密该信息, 它也可以对公共密钥加密的信息解密。在提供同等安全性的前提下, 专用密钥加密的系统速度比较快。 RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。RC5是种比较新的算法,Rivest设计了RC5的一种特殊的实现方式,因此RC5算法有一个面向字的结构:RC5-w/r/b,这里w是字长其值可以是16、32或64对于不同的字长明文和密文块的分组长度为2w位,r是加密轮数,b是密钥字节长度。由于RC5一个分组长度可变的密码算法,为了便于说明在本文中主要是针对64位的分组w=32进行处理的,下面详细说明了RC5加密解密的处理过程: 1、创建密钥组,RC5算法加密时使用了2r+2个密钥相关的的32位字:,这里r表示加密的轮数。创建这个密钥组的过程是非常复杂的但也是直接的,首先将密钥字节拷贝到32位字的数组L中(此时要注意处理器是little- endian顺序还是big-endian顺序),如果需要,最后一个字可以用零填充。然后利用线性同余发生器模2初始化数组S: 对于i=1到2(r+1)-1: (本应模 ,本文中令w=32) 其中对于16位字32位分组的RC5,P=0xb7e1 Q=0x9e37 对于32位字和64位分组的RC5,P=0xb7e15163 Q=0x9e3779b9 对于64位字和128位分组,P=0xb7151628aed2a6b Q=0x9e3779b97f4a7c15 最后将L与S混合,混合过程如下: i=j=0 A=B=0 处理3n次(这里n是2(r+1)和c中的最大值,其中c表示输入的密钥字的个数) 2、加密处理,在创建完密钥组后开始进行对明文的加密,加密时,首先将明文分组划分为两个32位字:A和B(在假设处理器字节顺序是little- endian、w=32的情况下,第一个明文字节进入A的最低字节,第四个明文字节进入A的最高字节,第五个明文字节进入B的最低字节,以此类推),其中操作符<<<表示循环左移,加运算是模 (本应模 ,本文中令w=32)的。输出的密文是在寄存器A和B中的内容 3、解密处理,解密也是很容易的,把密文分组划分为两个字:A和B(存储方式和加密一样),这里符合>>>是循环右移,减运算也是模 (本应模 ,本文中令w=32)的。 IDEA算法被认为是当今最好最安全的分组密码算法!
2023-06-10 00:51:231

什么是存储多字节数据的小端方式?

例如数字 0x2345 在内存中存储的时候低地址存45,高地址存23。详细叙述如下:Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:1)大端模式:低地址 -----------------> 高地址0x12 | 0x34 | 0x56 | 0x782)小端模式:低地址 ------------------> 高地址0x78 | 0x56 | 0x34 | 0x12
2023-06-10 00:51:311

汇编程序员在存储器中读写数据时,不需关注存储器的大小端顺序吗?

ue63c存储的大小端问题 - 赖small强的博客 - CSDN博客2016年3月18日 数据在内存中的存储是以字节(8位)的形式存储的,即每个内存地址只能存放8位的数据,现在我先给出大...CSDN博客ue63c汇编程序员在存储器中读写数据时,不需关注存储器的大小端顺序吗? - 资深答主答疑 - 问一问近期使用过该服务在线2236位电子数码答主在线答
2023-06-10 00:51:393

java运行char类型出现了倒着的os

出现倒着的os是因为在Java中,char类型占用两个字节,即16位,表示的是Unicode字符。Unicode是一种跨语言、跨平台的字符集标准,Java利用Unicode编码来表示字符。在Java中,char类型是无符号的,其范围是0-65535。当我们在Java中输出char类型数据时,实际上是将其Unicode编码对应的字符显示在控制台上,而Unicode编码的顺序是从左至右,而不是从右至左。因此,当我们输出的字符是从右至左书写的语言(如阿拉伯语、波斯语等)时,就会出现倒着的现象。需要注意的是,Java在输出char类型数据时,会根据操作系统的不同自动选择适合的字符编码来进行输出。因此,在不同的操作系统上可能会出现不同的显示效果。如果需要在Java中输出特定的字符编码,可以使用Java提供的Charset类来指定字符编码。
2023-06-10 00:51:4715

c51中一般指针变量占用多少字节存储

色的土布门帘;他刚才睡的床是
2023-06-10 00:52:115

在windows中怎么知道字节序

网络字节顺序字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:a)Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b)Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。c)网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
2023-06-10 00:52:441

htonl() ntohl()这两个函数有什么区别?

htonl函数,是将主机端一个无符号长整数转换为TCP/IP协议网络的大端(big endian)格式的字节序列!ntohl函数正好相反!这两个函数多用于使用Intel处理器的主机,因为Intel处理器使用小端数据格式(little endian)!而TCP/IP协议网络是用大端(big endian)格式的!
2023-06-10 00:52:521

怎么确认一台电脑是big-endian 还是little-endian

#include <stdio.h> #include <stdint.h> int is_big_endian(void) { union { uint32_t i; char c[4]; } e = {0x10000000}; return e.c[0]; } int main(void) { printf("System is %s -endian. ", is_big_endian() ? "big" : "little"); return 0; }
2023-06-10 00:52:591

若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。函数原型:int checkCPU( );

作业一:union Test{ short a; char b[2];};int checkCPU(){ union Test c; c.a = 0x1122; if(c.b[0] == 0x22) return 1; else return 0;}//这下面是调试用的/*int main(){ printf("%d",checkCPU()); return 0;}*/作业二没看懂作业三:int STRCMP(char *source,char *dest){ while(*source != "" || *dest != "") { if(*source != *dest) return -1; source++; dest++; } return 0;}望采纳,本人贫民也
2023-06-10 00:53:081

36kr是字节的吗

36kr是字节。多字节字段中的值是按照大末尾(big- endian)顺序规定的,具体来说就是最高位的字节出现在高位,而低位的字节出现在低位。这会引起工作在Intel平台上的程序员的迷惑,因为在 Intel的平台上。数据是按照小末尾(little-endian)顺序存储的,高位的字节出现在低位。1字节(Byte)=8位(bit):1KB( Kilobyte,千字节)=1024B。1MB( Megabyte,兆字节)=1024KB。1GB( Gigabyte,吉字节,千兆)=1024MB。1TB( Trillionbyte,万亿字节,太字节)=1024GB。1PB( Petabyte,千万亿字节,拍字节)=1024TB。1EB( Exabyte,百亿亿字节,艾字节)=1024PB。
2023-06-10 00:53:261

请问以低字节的地址为字地址的存放方式是什么意思呢?以高字节的地址

内存地址从上往下依次降低:(每个单元存放一个字节)|78||56||34||12|
2023-06-10 00:53:422

java little-endian big-endian

import java.io.*;public class SimIo { public static void main(String [] args){ //16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 String be = "UTF-16BE"; //16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序, 应该采用这种编码 String le = "UTF-16LE"; // String uni = "Unicode"; String path = "test.txt"; try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter (new FileOutputStream(path),le)); String con = "你好么,呵呵,hello!!"; bw.write(con, 0, con.length()); bw.flush(); } catch(Exception e) { System.err.println(e.getMessage()); } }}
2023-06-10 00:53:491

C语言中整型数组的每个元素在内存中是如何存放的?

整型数组每个元素在内存中连续存储,每个整型元素存储方式取决于机器硬件。一、数组元素都是连续存储的,地址依次从低到高。如字符数组 char a[10];其元素有10个,为a[0]到a[9], 地址连续。 如果a的起始地址为0x1234,那么后续地址依次为0x1235, 0x1235...0x123D。二、每个元素具体存储方式,取决于CPU。 有两种:1、小端(Little Endian):将低序字节存储在起始地址(低位编址), 地址低位存储值的低位,地址高位存储值的高位 。目前大多数CPU是按照这种方式存储的,包括intel和移动端最常见的arm。比如4字节整型值为0x12345678的情况,那么在内存中会存储为:0x78 0x56 0x34 0x122、大端(Big Endian):与小端相反, 将高序字节存储在起始地址(高位编址),地址低位存储值的高位,地址高位存储值的低位。之前的例子在大端情况下存储为:0x12 0x34 0x56 0x78
2023-06-10 00:53:581

一个51单片机C程序,里面有一个bin的文件,这个bin文件应该包含了几个重要的函数;能用什么打开!

uedit32 可以打开
2023-06-10 00:54:166

C#里面 Encoding 这个类怎么使用?

C#里面利用Encoding类可以把当前编码字符串按指定编码方式编码为其他编码。1、ASCIIEncoding 将 Unicode 字符编码为单个 7 位 ASCII 字符。此编码仅支持 U+0000 和 U+007F 之间的字符值。代码页 20127。还可通过 ASCII 属性获得。2、UTF7Encoding 使用 UTF-7 编码对 Unicode 字符进行编码。此编码支持所有 Unicode 字符值。代码页 65000。还可通过 UTF7 属性获得。3、UTF8Encoding 使用 UTF-8 编码对 Unicode 字符进行编码。此编码支持所有 Unicode 字符值。代码页 65001。还可通过 UTF8 属性获得。4、UnicodeEncoding 使用 UTF-16 编码对 Unicode 字符进行编码。支持 Little-Endian(代码页 1200)和 Big-Endian(代码页 1201)字节顺序。还可通过 Unicode 属性和 BigEndianUnicode 属性获得。5、UTF32Encoding 使用 UTF-32 编码对 Unicode 字符进行编码。支持 Little-Endian(代码页 65005)和 Big-Endian(代码页 65006)字节顺序。还可通过 UTF32 属性获得。扩展资料:Encoding 提供一个前导码(即一个字节数组),可以将它作为编码过程中所产生的字节序列的前缀。如果前导码中包含字节顺序标记(在 Unicode 中,码位为 U+FEFF),则它会帮助解码器确定字节顺序和转换格式或 UTF。通常,使用本机字节顺序存储 Unicode 字符的效率更高。例如,在 Little-Endian 平台(如 Intel 计算机)上最好使用 Little-Endian 字节顺序。
2023-06-10 00:54:331

数据在内存中的存储方式

数据在存放到内存里的时候,有两种存放方式,即:Big Endian 和 Little Endian这两个存取方式决定了内存存放数据的原则是 高高低低 原则 还是 高低低高 原则。高高低低--内存中的高位存放数据的高位,内存中的低位存放数据的低位(Little Endian )高低低高--内存中的高位存放数据的低位,内存中的低位存放数据的高位(Big Endian )比如:我有一个数据,是0xA5A1,它在存放到内存中是怎样存放的呢?因为在我们平时的书写中,A5是高位,A1在低位,存放到内存中的时候,A1存放在0x4000这个位置,而A5存放在0x4001这个位置,高位存放在内存的高地址中,低位存放在低地址中,这种方式就是Little Endian 。
2023-06-10 00:54:512

不同体系结构的处理器有big endian和little endian 模式,哪位能告诉我两者之间的区别

Big Endian 和 Little Endian [转]powerpc 发表于 2005-5-5 15:25:00 谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是 little endian呢? 其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。 用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:Big Endian 低地址 高地址 -----------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 12 | 34 | 56 | 78 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Little Endian 低地址 高地址 -----------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 78 | 56 | 34 | 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,!@#$%^&*,见鬼去吧 -_-||| 为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而 JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA 采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。 无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。·BE和LE一文的补完我在8月9号的《Big Endian和Little Endian》一文中谈了字节序的问题,原文见上面的超级链接。可是有朋友仍然会问,CPU存储一个字节的数据时其字节内的8个比特之间的顺序是否也有big endian和little endian之分?或者说是否有比特序的不同? 实际上,这个比特序是同样存在的。下面以数字0xB4(10110100)用图加以说明。 Big Endian msb lsb ----------------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Little Endian lsb msb ----------------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+实际上,由于CPU存储数据操作的最小单位是一个字节,其内部的比特序是什么样对我们的程序来说是一个黑盒子。也就是说,你给我一个指向0xB4这个数的指针,对于big endian方式的CPU来说,它是从左往右依次读取这个数的8个比特;而对于little endian方式的CPU来说,则正好相反,是从右往左依次读取这个数的8个比特。而我们的程序通过这个指针访问后得到的数就是0xB4,字节内部的比特序对于程序来说是不可见的,其实这点对于单机上的字节序来说也是一样的。 那可能有人又会问,如果是网络传输呢?会不会出问题?是不是也要通过什么函数转换一下比特序?嗯,这个问题提得很好。假设little endian方式的CPU要传给big endian方式CPU一个字节的话,其本身在传输之前会在本地就读出这个8比特的数,然后再按照网络字节序的顺序来传输这8个比特,这样的话到了接收端不会出现任何问题。而假如要传输一个32比特的数的话,由于这个数在littel endian方存储时占了4个字节,而网络传输是以字节为单位进行的,little endian方的CPU读出第一个字节后发送,实际上这个字节是原数的LSB,到了接收方反倒成了MSB从而发生混乱。
2023-06-10 00:55:131

Big-endian和Little-endian各有什么利弊

Big Endian 和 Little Endian的区别:在设计计算机系统的时候,有两种处理内存中数据的方法。一种叫为little-endian,存放在内存中最低位的数值是来自数据的最右边部分(也就是数据的最低位部分)。比如一个16进制数字0x12345678,在内存存放的方式如下:低地址 ------------------> 高地址####################################################值 #0111,1000 #0101,0110 # 0011,0100 # 0001,0010 #####################################################地址 # 100 # 101 # 102 # 103 #####################################################另一种称为big-endian,正好相反,存放在内存中最低位的数值是来自数据的最左边边部分(也就是数据的最高为部分)。比如一个16进制数字0x12345678,在内存存放的方式如下:低地址 ------------------> 高地址####################################################值 # 0001,0010 #0011,0100 # 0101,0110 # 0111,1000 #####################################################地址 # 100 # 101 # 102 # 103 #####################################################从上面的例子可以看到,采用big endian方式存储数据是符合我们人类的思维习惯的big endian:是指低地址存放最高有效字节(MSB:Most Significant Byte, 最高有效字节),little endian:则是低地址存放最低有效字节(LSB:Least Significant Byte, 最低有效字节)谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。IBM, Motorola(Power PC), Sun的机器一般采用大端(big endian)方式存储数据。而x86系列则采用little endian方式存储数据是Little Endian还是Big Endian与操作系统和芯片类型都有关系。 具体情形参考处理器手册。2. 如何判断系统是Big Endian还是Little Endian在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或_BYTE_ORDER, __BYTE_ORDER),确定其值。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。一般来说,Little Endian系统BYTE_ORDER(或_BYTE_ORDER,__BYTE_ORDER)为1234,Big Endian系统为4321
2023-06-10 00:55:331

在windows中怎么知道字节序?bigendian or littleendian

网络字节顺序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
2023-06-10 00:55:401

如何为现有的openwrt编译一个opkg上没有的软件

这是我去年编辑一个软件时记下的过程,希望对你有所帮助,我也是新手,按照官方提供的教程一步步修改,中间断断续续弄了近两个月,最后总算编译成功了。一、安装编译环境(以ubuntu10.10为例)依次输入以下命令:1.ubuntu开发环境需要的软件:sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawksudo apt-get update2.创建目录mkdir openwrt3.获取OpenWrt源代码和安装包,更新svn checkout svn://svn.openwrt.org/openwrt/backfirecd backfire./scripts/feeds update -a./scripts/feeds install -a4.配置编译选项make menuconfig在target system里选择Broadcom BCM63xx,根据需要选择其他的软件,*:表示该模块直接编译到核心中M:该模块以被核心支持,可以后再安装空白:不支持该模块具体模块的起什么作用需要多google;5.编译选项配置保存后,开始编译make V=99V=99表示输出详细的debug信息;二、编译准备1.下载源文件下载地址:http://ftp.awk.cz/cntlm/ ,最新的版本是0.91rc6;2.获取md5sum码进入下载文件目录,在终端里输入 md5sum cntlm-0.91rc6.tar.gz获得md5验证码:21ccd60294269cb8fbe3e2e49374ab1b3.编写makefile文件在openwrt/backfire目录中的package目录下新建cntlm目录,在cntlm目录下新建文件,命名为makefile,编辑makefile文件,加入如下内容:---------------------------------------------------------------------------------------------------------------------------## Copyright (C) 2006-2008 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#include $(TOPDIR)/rules.mkPKG_NAME:=cntlmPKG_VERSION:=0.91rc6PKG_RELEASE:=1PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gzPKG_SOURCE_URL:=http://ftp.awk.cz/cntlm/PKG_MD5SUM:=21ccd60294269cb8fbe3e2e49374ab1bPKG_INSTALL:=1include $(INCLUDE_DIR)/package.mkdefine Package/cntlm SUBMENU:=Proxy Servers SECTION:=net CATEGORY:=Network TITLE:=Cntlm is a Fast NTLM Authentication Proxy URL:=http://cntlm.sourceforge.net/endefdefine Package/cntlm/install $(INSTALL_DIR) $(1)/usr/sbin $(CP) $(PKG_INSTALL_DIR)/usr/sbin/cntlm $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/usr/share/man/man1 $(CP) $(PKG_INSTALL_DIR)/usr/share/man/man1/$(PKG_NAME).1 $(1)/usr/share/man/man1 $(INSTALL_DIR) $(1)/etc/ $(CP) $(PKG_INSTALL_DIR)/etc/cntlm.conf $(1)/etc/endef$(eval $(call BuildPackage,cntlm))---------------------------------------------------------------------------------------------------------------------------4.编写patch文件由于BCM63xx核心是big endian,而我们常用的intel或AMD的cpu都是little endian的,cntlm虽然能够自己检测编译环境的endian,但我们是在交叉编译环境中编译,cntlm检测出来的还是ubuntu系统的endian,因此需要设置手动endian为big endian。具体就是将源码文件中的config/endian.c文件的rc设定为0.将源码文件中的endian.c文件分别复制到a目录下的config目录和b目录下的config目录,打开b目录下的config目录中的endian.c文件,并将其修改为:-------------------------------------------------------------------------------------------------------------------------#include <stdio.h>#include <stdint.h>int main(int argc, char **argv) { int rc; rc = 0; printf("%s ", rc ? "little endian" : "big endian"); return rc;}---------------------------------------------------------------------------------------------------------------------------然后保存。运行:diff -Naur a/config/endian.c b/config/endian.c >endian.patchendian.patch文件内容如下:------------------------------------------------------------------------------------------------------------------------------ a/config/endian.c 2007-08-20 07:23:17.000000000 +0800+++ b/config/endian.c 2010-11-01 18:36:32.000000000 +0800@@ -1,15 +1,11 @@ #include <stdio.h> #include <stdint.h>-uint8_t num[] = { 0xEF, 0xBE };-/*- * RC: 1 = LE, 0 = BE- */ int main(int argc, char **argv) { int rc;- rc = (*((uint16_t *)num) == 0xBEEF);+ rc = 0; printf("%s ", rc ? "little endian" : "big endian");return rc;---------------------------------------------------------------------------------------------------------------------------将endian.patch文件复制到package/cntlm/patches/目录下(没有patches目录就新建一个)。三、编译1.选定安装包终端输入:make menuconfig在Network——》Proxy Severs中选择cntlm;2.开始编译终端输入:make package/cntlm/compile V=99中间可能会出现一些提示(Note),可以不用理会。编译完成后在bin/packages目录下可以看到cntlm_0.91rc6-1_brcm63xx.ipk文件啦。四、补充上面提到在编译过程中出会现提示(Note),一般如下:utils.c:1: note: someone does not honour COPTS correctly, passed 0 times这是由于cntlm源码文件中CFLAG的设置是覆盖而不是续接,与openwrt要求不同,在openwrt一般写成CFLAG += 的方式。可以通过如下修改去除note:将源码包中的Makefile文件复制到a目录和b目录,打开b目录下的Makefile文件,作如下修改:CFLAGS+=$(FLAGS)即增加上面的“+”号,保存。运行:diff -Naur a/Makefile b/Makefile > makefile.patch得到的makefile.patch文件如下:------------------------------------------------------------------------------------------------------------------------------ a/Makefile 2010-04-29 19:18:58.000000000 +0800+++ b/Makefile 2010-11-09 20:17:33.405177000 +0800@@ -16,7 +16,7 @@ CC=gcc VER=`cat VERSION` OBJS=utils.o ntlm.o xcrypt.o config.o socket.o acl.o auth.o http.o forward.o direct.o scanner.o pages.o main.o-CFLAGS=$(FLAGS) -std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE -D_REENTRANT -DVERSION="`cat VERSION`" -g+CFLAGS+=$(FLAGS) -std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE -D_REENTRANT -DVERSION="`cat VERSION`" -g OS=$(shell uname -s) OSLDFLAGS=$(shell [ $(OS) = "SunOS" ] && echo "-lrt -lsocket -lnsl") LDFLAGS:=-lpthread $(OSLDFLAGS)---------------------------------------------------------------------------------------------------------------------------将makefile.patch文件复制到package/cntlm/patches目录下,重新编译即可。
2023-06-10 00:55:471

android 手机一般是big-endian,还是little-endian?

Intel计算机采用的是Ltttle Endian,而Motorola处理器、IBM大型机、SPARC处理器和ARM处理器使用Little Endian方案。
2023-06-10 00:56:113

如何为现有的openwrt编译一个opkg上没有的软件

一、安装编译环境(以ubuntu10.10为例)依次输入以下命令:1.ubuntu开发环境需要的软件:sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawksudo apt-get update2.创建目录mkdir openwrt3.获取OpenWrt源代码和安装包,更新svn checkout svn://svn.openwrt.org/openwrt/backfirecd backfire./scripts/feeds update -a./scripts/feeds install -a4.配置编译选项make menuconfig在target system里选择Broadcom BCM63xx,根据需要选择其他的软件,*:表示该模块直接编译到核心中M:该模块以被核心支持,可以后再安装空白:不支持该模块具体模块的起什么作用需要多google;5.编译选项配置保存后,开始编译make V=99V=99表示输出详细的debug信息;二、编译准备1.下载源文件下载地址:http://ftp.awk.cz/cntlm/ ,最新的版本是0.91rc6;2.获取md5sum码进入下载文件目录,在终端里输入 md5sum cntlm-0.91rc6.tar.gz获得md5验证码:21ccd60294269cb8fbe3e2e49374ab1b3.编写makefile文件在openwrt/backfire目录中的package目录下新建cntlm目录,在cntlm目录下新建文件,命名为makefile,编辑makefile文件,加入如下内容:---------------------------------------------------------------------------------------------------------------------------## Copyright (C) 2006-2008 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#include $(TOPDIR)/rules.mkPKG_NAME:=cntlmPKG_VERSION:=0.91rc6PKG_RELEASE:=1PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gzPKG_SOURCE_URL:=http://ftp.awk.cz/cntlm/PKG_MD5SUM:=21ccd60294269cb8fbe3e2e49374ab1bPKG_INSTALL:=1include $(INCLUDE_DIR)/package.mkdefine Package/cntlm SUBMENU:=Proxy Servers SECTION:=net CATEGORY:=Network TITLE:=Cntlm is a Fast NTLM Authentication Proxy URL:=http://cntlm.sourceforge.net/endefdefine Package/cntlm/install $(INSTALL_DIR) $(1)/usr/sbin $(CP) $(PKG_INSTALL_DIR)/usr/sbin/cntlm $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/usr/share/man/man1 $(CP) $(PKG_INSTALL_DIR)/usr/share/man/man1/$(PKG_NAME).1 $(1)/usr/share/man/man1 $(INSTALL_DIR) $(1)/etc/ $(CP) $(PKG_INSTALL_DIR)/etc/cntlm.conf $(1)/etc/endef$(eval $(call BuildPackage,cntlm))---------------------------------------------------------------------------------------------------------------------------4.编写patch文件由于BCM63xx核心是big endian,而我们常用的intel或AMD的cpu都是little endian的,cntlm虽然能够自己检测编译环境的endian,但我们是在交叉编译环境中编译,cntlm检测出来的还是ubuntu系统的endian,因此需要设置手动endian为big endian。具体就是将源码文件中的config/endian.c文件的rc设定为0.将源码文件中的endian.c文件分别复制到a目录下的config目录和b目录下的config目录,打开b目录下的config目录中的endian.c文件,并将其修改为:-------------------------------------------------------------------------------------------------------------------------#include <stdio.h>#include <stdint.h>int main(int argc, char **argv) { int rc; rc = 0; printf("%s ", rc ? "little endian" : "big endian"); return rc;}---------------------------------------------------------------------------------------------------------------------------然后保存。运行:diff -Naur a/config/endian.c b/config/endian.c >endian.patchendian.patch文件内容如下:------------------------------------------------------------------------------------------------------------------------------ a/config/endian.c 2007-08-20 07:23:17.000000000 +0800+++ b/config/endian.c 2010-11-01 18:36:32.000000000 +0800@@ -1,15 +1,11 @@ #include <stdio.h> #include <stdint.h>-uint8_t num[] = { 0xEF, 0xBE };-/*- * RC: 1 = LE, 0 = BE- */ int main(int argc, char **argv) { int rc;- rc = (*((uint16_t *)num) == 0xBEEF);+ rc = 0; printf("%s ", rc ? "little endian" : "big endian");return rc;---------------------------------------------------------------------------------------------------------------------------将endian.patch文件复制到package/cntlm/patches/目录下(没有patches目录就新建一个)。三、编译1.选定安装包终端输入:make menuconfig在Network——》Proxy Severs中选择cntlm;2.开始编译终端输入:make package/cntlm/compile V=99中间可能会出现一些提示(Note),可以不用理会。编译完成后在bin/packages目录下可以看到cntlm_0.91rc6-1_brcm63xx.ipk文件啦。四、补充上面提到在编译过程中出会现提示(Note),一般如下:utils.c:1: note: someone does not honour COPTS correctly, passed 0 times这是由于cntlm源码文件中CFLAG的设置是覆盖而不是续接,与openwrt要求不同,在openwrt一般写成CFLAG += 的方式。可以通过如下修改去除note:将源码包中的Makefile文件复制到a目录和b目录,打开b目录下的Makefile文件,作如下修改:CFLAGS+=$(FLAGS)即增加上面的“+”号,保存。运行:diff -Naur a/Makefile b/Makefile > makefile.patch得到的makefile.patch文件如下:------------------------------------------------------------------------------------------------------------------------------ a/Makefile 2010-04-29 19:18:58.000000000 +0800+++ b/Makefile 2010-11-09 20:17:33.405177000 +0800@@ -16,7 +16,7 @@ CC=gcc VER=`cat VERSION` OBJS=utils.o ntlm.o xcrypt.o config.o socket.o acl.o auth.o http.o forward.o direct.o scanner.o pages.o main.o-CFLAGS=$(FLAGS) -std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE -D_REENTRANT -DVERSION="`cat VERSION`" -g+CFLAGS+=$(FLAGS) -std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE -D_REENTRANT -DVERSION="`cat VERSION`" -g OS=$(shell uname -s) OSLDFLAGS=$(shell [ $(OS) = "SunOS" ] && echo "-lrt -lsocket -lnsl") LDFLAGS:=-lpthread $(OSLDFLAGS)---------------------------------------------------------------------------------------------------------------------------将makefile.patch文件复制到package/cntlm/patches目录下,重新编译即可。
2023-06-10 00:56:191

校园卡的编码方式什么

搞清常用编码特性是解决字符集编码问题的基础。字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字符串(例如字符数计算、截断处理)等都需要弄清楚编码的特性。了解一种字符集编码主要是要了解该编码的编码范围,编码对应的字符集(都包含哪些字符),和其他字符集编码之间的关系等。ASCIIASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。GB2312GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般 用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字 计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉 字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。EUC-CN可以理解为GB2312的别名,和GB2312完全相同。区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这 种字符集的编码。HZ和ISO-2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。GBKGBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。有些系统中用0x40-0x7E中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也存在相应问题。CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。GB18030GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。GB18030的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节 的编码范围是0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。Windows中CP936代码页使用0x80来表示欧元符号,而在GB18030编码中没有使用0x80编码位,用其他位置来表示欧元符号。这可以理解为是GB18030向下兼容性上的一点小问题;也可以理解为0x80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。BIG5Big5是双字节编码,高字节编码范围是0x81-0xFE,低字节编码范围是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字节是0x80-0xA0的组合。0x8140-0xA0FE是保留区域,用于用户造字区。Big5收录的汉字只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录。GBK收录的日文假名字符、俄文字符Big5也没有收录。因为Big5当中收录的字符有限,因此有很多在Big5基础上扩展的编码,如倚天中文系统。Windows系统上使用的代码页CP950也可以理解为是对Big5的扩展,在Big5的基础上增加了7个汉字和一些符号。Big5编码对应的字符集是GBK字符集的子集,也就是说Big5收录的字符是GBK收录字符的一部分,但相同字符的编码不同。因为Big5也占用了ASCII的编码空间(低字节所使用的0x40-0x7E),所以Big5编码在一些环境下存在和GBK编码相同的问题,即低字节范围为0x40-0x7E的字符有可能会被误处理,尤其是低字节是0x5C("/")和0x7C("|")的字符。可以参考GBK一节相应说明。尽管有些区别,大多数情况下可以把CP950当作Big5的别名。ISO-8859-1ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。UCS-2和UTF-16Unicode组织和ISO组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号,这个字符集就是通用字符集(UCS,Universal Character Set)。这两个组织经过协调,虽然在各自发展,但定义的字符位置是完全一致的。ISO相应的标准是ISO 10646。Unicode和ISO 10646都在不断的发展过程中,所以会有不同的版本号来标明不同的发展阶段,每个Unicode版本号都能找到相对应的ISO 10646版本号。ISO 10646标准定义了一个31位的字符集。前两个字节的位置(0x0000-0xFFFD)被称为基本多语言面(Basic Multilingual Plane, BMP) ,超出两个字节的范围称作辅助语言面。BMP基本包括了所有语言中绝大多数字符,所以只要支持BMP就可以支持绝大多数场合下的应用。Unicode 3.0对应的字符集在BMP范围内。UCS字符集为每个字符分配了一个位置,通常用“U”再加上某个字符在UCS中位置的16进制数作为这个字符的UCS表示,例如“U+0041”表示字符“A”。UCS字符U+0000到U+00FF与ISO-8859-1完全一致。UCS-2、UTF-16是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。UCS-2是两个字节的等宽编码,因为只是使用了两个字节的编码空间,所以只能对BMP中的字符做编码。UTF-16是变长编码,用两个字节对BMP内的字符编码,用4个字节对超出BMP范围的辅助平面内的字符作编码。UCS-2不同于GBK和Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。UTF-16是UCS-2的超集,UTF-16编码的两字节编码方式完全和UCS-2相同,也就是说在BMP的框架内UCS-2完全等同与UTF-16。实际情况当中常常把UCS-16当作UCS-2的别名。UCS-2和UTF-16在存储和传输时会使用两种不同的字节序,分别是big endian和little endian(大尾和小尾)。例如“啊”(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默认的字节序是big endian方式。在传输过程中为了说明字节序需要在字节流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。UCS-2BE、UCS-2LE是实际应用中使用的编码名称,对应着big endian和little endian,UTF-16BE、UTF-16LE也是如此。因为默认是BE字节序,所以可以把UCS-2当做是UCS-2BE的别名。在UCS编码中有一个叫做“ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是U+FEFF,是个没有实际意义的字符。UCS规范建议我们在传输字节流前,先传输字符“ZERO WIDTH NO-BREAK SPACE”,如果传输的ZERO WIDTH NO-BREAK SPACE是0xFEFF就说明是big endian,反之就是little endian。UCS-2和UTF-16也可以理解为和ASCII以及ISO-8859-1兼容,在ASCII编码或者ISO-8859-1编码的每个字节前加上0x00,就得到相应字符的UCS-2编码。UCS-2和UTF-16中会使用0x00作为某个字符编码的一部分,某些系统会把0x00当作字符串结束的标志,在处理UCS-2或UTF-16编码时会出现问题。UTF-8UTF-8是UCS字符集的另一种编码方式,UTF-16的每个单元是两个字节(16位),而UTF-8的每个单元是一个字节(8位)。UTF-16中用一个或两个双字节表示一个字符,UTF-8中用一个或几个单字节表示一个字符。可以认为UTF-8编码是根据一定规律从UCS-2转换得到的,从UCS-2到UTF-8之间有以下转换关系:UCS-2 UTF-8U+0000 - U+007F 0xxxxxxxU+0080 - U+07FF 110xxxxx 10xxxxxxU+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx例如“啊”字的UCS-2编码是0x554A,对应的二进制是0101 0101 0100 1010,转成UTF-8编码之后的二进制是1110 0101 10 010101 10 001010,对应的十六进制是0xE5958A。UCS-4也是一种UCS字符集的编码方式,是使用4个字节的等宽编码,可以用UCS-4来表示BMP之外的辅助面字符。UCS-2中每两个字节前再加上0x0000就得到了BMP字符的UCS-4编码。从UCS-4到UTF-8也存在转换关系,根据这种转换关系,UTF-8最多可以使用六个字节来编码UCS-4。根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性:UTF-8完全和ASCII兼容,也就是说ASCII对应的字符在UTF-8中和ASCII编码完全一致。范围在0x00-0x7F之内的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。大于U+007F的UCS字符,在UTF-8编码中至少是两个字节。UTF-8中的每个字符编码的首字节总在0x00-0xFD之间(不考虑UCS-4支持的情况,首字节在0x00-0xEF之间)。根据首字节就可以判断之后连续几个字节。非首字节的其他字节都在0x80-0xBF之间;0xFE和0xFF在UTF-8中没有被用到。GBK编码中的汉字字符都在UCS-2中的范围都在U+0800 - U+FFFF之间,所以每个GBK编码中的汉字字符的UTF-8编码都是3个字节。但GBK中包含的其他字符的UTF-8编码就不一定是3个字节了,如GBK中的俄文字符。在UTF-8的编码的传输过程中即使丢掉一个字节,根据编码规律也很容易定位丢掉的位置,不会影响到其他字符。在其他双字节编码中,一旦损失一个字节,就会影响到此字节之后的所有字符。从这点可以看出UTF-8编码非常适合作为传输编码参考资料:http://bbs.topsage.com/index_2.html
2023-06-10 00:56:381

编码方式的编码方式

搞清常用编码特性是解决字符集编码问题的基础。字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字符串(例如字符数计算、截断处理)等都需要弄清楚编码的特性。了解一种字符集编码主要是要了解该编码的编码范围,编码对应的字符集(都包含哪些字符),和其他字符集编码之间的关系等。ASCIIASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x1F和0x7F共33个控制字符。 只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。GB2312GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般 用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字 计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉 字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。GB2312的编码范围是0xA1A1-0xFEFE,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。EUC-CN可以理解为GB2312的别名,和GB2312完全相同。区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这 种字符集的编码。HZ和ISO-2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。GBKGBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。有些系统中用0x40-0x7E中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也存在相应问题。CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。GB18030GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。GB18030的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节 的编码范围是0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。Windows中CP936代码页使用0x80来表示欧元符号,而在GB18030编码中没有使用0x80编码位,用其他位置来表示欧元符号。这可以理解为是GB18030向下兼容性上的一点小问题;也可以理解为0x80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。BIG5Big5是双字节编码,高字节编码范围是0x81-0xFE,低字节编码范围是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字节是0x80-0xA0的组合。0x8140-0xA0FE是保留区域,用于用户造字区。Big5收录的汉字只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录。GBK收录的日文假名字符、俄文字符Big5也没有收录。因为Big5当中收录的字符有限,因此有很多在Big5基础上扩展的编码,如倚天中文系统。Windows系统上使用的代码页CP950也可以理解为是对Big5的扩展,在Big5的基础上增加了7个汉字和一些符号。Big5编码对应的字符集是GBK字符集的子集,也就是说Big5收录的字符是GBK收录字符的一部分,但相同字符的编码不同。因为Big5也占用了ASCII的编码空间(低字节所使用的0x40-0x7E),所以Big5编码在一些环境下存在和GBK编码相同的问题,即低字节范围为0x40-0x7E的字符有可能会被误处理,尤其是低字节是0x5C("/")和0x7C("|")的字符。可以参考GBK一节相应说明。尽管有些区别,大多数情况下可以把CP950当作Big5的别名。ISO-8859-1ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。UCS-2和UTF-16Unicode组织和ISO组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号,这个字符集就是通用字符集(UCS,Universal Character Set)。这两个组织经过协调,虽然在各自发展,但定义的字符位置是完全一致的。ISO相应的标准是ISO 10646。Unicode和ISO 10646都在不断的发展过程中,所以会有不同的版本号来标明不同的发展阶段,每个Unicode版本号都能找到相对应的ISO 10646版本号。ISO 10646标准定义了一个31位的字符集。前两个字节的位置(0x0000-0xFFFD)被称为基本多语言面(Basic Multilingual Plane, BMP) ,超出两个字节的范围称作辅助语言面。BMP基本包括了所有语言中绝大多数字符,所以只要支持BMP就可以支持绝大多数场合下的应用。Unicode 3.0对应的字符集在BMP范围内。UCS字符集为每个字符分配了一个位置,通常用“U”再加上某个字符在UCS中位置的16进制数作为这个字符的UCS表示,例如“U+0041”表示字符“A”。UCS字符U+0000到U+00FF与ISO-8859-1完全一致。UCS-2、UTF-16是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。UCS-2是两个字节的等宽编码,因为只是使用了两个字节的编码空间,所以只能对BMP中的字符做编码。UTF-16是变长编码,用两个字节对BMP内的字符编码,用4个字节对超出BMP范围的辅助平面内的字符作编码。UCS-2不同于GBK和Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。UTF-16是UCS-2的超集,UTF-16编码的两字节编码方式完全和UCS-2相同,也就是说在BMP的框架内UCS-2完全等同与UTF-16。实际情况当中常常把UCS-16当作UCS-2的别名。UCS-2和UTF-16在存储和传输时会使用两种不同的字节序,分别是big endian和little endian (大尾和小尾)。例如“啊”(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默认的字节序是big endian方式。在传输过程中为了说明字节序需要在字节流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。UCS-2BE、UCS-2LE是实际应用中使用的编码名称,对应着big endian和little endian,UTF-16BE、UTF-16LE也是如此。因为默认是BE字节序,所以可以把UCS-2当做是UCS-2BE的别名。在UCS编码中有一个叫做“ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是U+FEFF,是个没有实际意义的字符。UCS规范建议我们在传输字节流前,先传输字符“ZERO WIDTH NO-BREAK SPACE”,如果传输的ZERO WIDTH NO-BREAK SPACE是0xFEFF就说明是big endian,反之就是little endian。UCS-2和UTF-16也可以理解为和ASCII以及ISO-8859-1兼容,在ASCII编码或者ISO-8859-1编码的每个字节前加上0x00,就得到相应字符的UCS-2编码。UCS-2和UTF-16中会使用0x00作为某个字符编码的一部分,某些系统会把0x00当作字符串结束的标志,在处理UCS-2或UTF-16编码时会出现问题。UTF-8UTF-8是UCS字符集的另一种编码方式,UTF-16的每个单元是两个字节(16位),而UTF-8的每个单元是一个字节(8位)。UTF-16中用一个或两个双字节表示一个字符,UTF-8中用一个或几个单字节表示一个字符。可以认为UTF-8编码是根据一定规律从UCS-2转换得到的,从UCS-2到UTF-8之间有以下转换关系:UCS-2 UTF-8U+0000 - U+007F 0xxxxxxxU+0080 - U+07FF 110xxxxx 10xxxxxxU+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx例如“啊”字的UCS-2编码是0x554A,对应的二进制是0101 0101 0100 1010,转成UTF-8编码之后的二进制是1110 0101 10 010101 10 001010,对应的十六进制是0xE5958A。UCS-4也是一种UCS字符集的编码方式,是使用4个字节的等宽编码,可以用UCS-4来表示BMP之外的辅助面字符。UCS-2中每两个字节前再加上0x0000就得到了BMP字符的UCS-4编码。从UCS-4到UTF-8也存在转换关系,根据这种转换关系,UTF-8最多可以使用六个字节来编码UCS-4。根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性:UTF-8完全和ASCII兼容,也就是说ASCII对应的字符在UTF-8中和ASCII编码完全一致。范围在0x00-0x7F之内的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。大于U+007F的UCS字符,在UTF-8编码中至少是两个字节。UTF-8中的每个字符编码的首字节总在0x00-0xFD之间(不考虑UCS-4支持的情况,首字节在0x00-0xEF之间)。根据首字节就可以判断之后连续几个字节。非首字节的其他字节都在0x80-0xBF之间;0xFE和0xFF在UTF-8中没有被用到。GBK编码中的汉字字符都在UCS-2中的范围都在U+0800 - U+FFFF之间,所以每个GBK编码中的汉字字符的UTF-8编码都是3个字节。但GBK中包含的其他字符的UTF-8编码就不一定是3个字节了,如GBK中的俄文字符。在UTF-8的编码的传输过程中即使丢掉一个字节,根据编码规律也很容易定位丢掉的位置,不会影响到其他字符。在其他双字节编码中,一旦损失一个字节,就会影响到此字节之后的所有字符。从这点可以看出UTF-8编码非常适合作为传输编码
2023-06-10 00:56:461

校园卡的编码方式什么?

一、“校园一卡通”信息的收集与整理,是学校信息化和校园数字化建设的一项基础性工程,各有关单位必须高度重视此项工作。并按照信息编码标准方案,组织专人对有关信息数据进行收集与整理。二、“校园一卡通”信息编码标准方案(试行)中有关数据的编码系采用教育部已颁布的教育管理信息标准代码和国家标准代码,根据我校实际情况,在数据信息收集与整理过程中,凡未涉及到的信息编码,请及时与网络中心联系。三、各有关单位在今后对本部门数据信息整理或信息管理系统开发(升级)时,要求采用《教育管理信息化标准》(第一部分:学校管理信息标准2003.9)中有关“高等学校管理信息”的信息标准。四、此次将《“校园一卡通”信息编码标准方案(试行)》中凡采用的教育部教育信息编码和国家标准编码作为附件一并印发,其它信息分类与代码标准将根据我校数字化建设的进展,在今后分期分批进行发布。五、各有关单位将数据信息收集和整理完毕后,务必于6月15日将数据库(Foxpro 或Excel)交网络中心汇总,以便后续“校园一卡通”工作的顺利开展。六、各有关单位在数据收集与整理过程中遇到问题,请及时与计算机网络中心联系。附件:1、“校园一卡通”信息编码标准方案(试行)2、各院(系)、职能部门和二级单位编码3、教育部教育信息标准代码和国家信息标准代码(部分)4、科室(教研室、课程组、研究室、实验室及党政各科室)基本信息。
2023-06-10 00:57:021

simulink访问串口频率

串口的基本参数配置:串口号,波特率,数据位,奇偶校验,停止位,传送顺序,是否硬件流,响应时间。串口号:根据硬件设备来选择(若插硬件,必须先插上串口,再打开MATLAB才会显示)波特率:与对应设备一致即可,我这里是使用115200.奇偶校验位:一般数据不使用,可通过传输数据中1的个数来检验数据是否有传输错误。传输顺序:在传输大于八位的数据时必须关注,先传输低八位使用 little-endian,否则 使用endian-little其他一般选默认即可。
2023-06-10 00:57:442

试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian)

【答案】:bool IsBigendian(){unsigned short usData = 0x1122;unsigned char *pucData = (unsignedchar*)&usData;return (*pucData == 0x22);}
2023-06-10 00:58:031

下载小说之后 用我的笔记本打开后出来乱七八糟的东西 只要是下载TXT的文件全是乱七八糟的东西根本就看不了

  打开文本文档点击另存为,在下方的编码上选择ANSI保存就行了,试试看  通用乱码解决方法:  1、转换编码。一般可试Big5、GBK、UTF-8(Unicode的一种应用方式,包括世界上主要的文字)三种,如涉及的不是中文,可以再试JIS(日文)、KR(韩文)及其他文字编码。彻底的解决方法是双方使用同一编码系统,如UTF8,只要用户有对应的字体档案就可以正确的显示文字。实际上要统一编码系统还要克服各种客观的困难,现时只有靠软件有更高的解码能力。  2、 转换字体。如果译码正确而出现错误文字,有可能是字体档案中没有相对应的字符,可尝试转换字体档案。  3、如果本来该显示出汉字的,却变成数字,如最 欣 赏 相 中 拉等Unicode代码,可以把这部分抄出来,**存储成html文件, 再用浏览器打开解码。  4、其他。有时译码的方法要视乎软件和实际环境,及不断尝试才能译码,特别在不知本来是用哪种编码系统时。  5、有时输入汉字时也会出现乱码,不过这种情况很少出现。最大的原因是输入法所用的编码,与经编辑器输出的字体编码不符所致,可尝试转换字体来解决。例如把GBK编码的输入法装到只支持Big5的系统上,是不能正确显示所输入的字的;必需选择Big5编码的输入法,或把输入法装到GBK的系统中。  6、 有关外文所引致的乱码,只有转换支持某外文的字体档案才能解决。  当你在windows下打开记事本写入一些东西,要保存这个文件时,会看到在编码选项中列有ANSI, Unicode, Unicode big endian, UTF-8,  他们是什么呢,有什么区别呢?有人用非常通俗的语言为我们解释了这个问题的来龙去脉,往下看  了解一下我们常用的编码方式:  ASCII编码是目前计算机中用得最广泛的字符集及其编码。  ISO8859-1可以表示的是西欧语言。看起来很单一为什么还在使用呢?,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。 而且在很多协议上,默认使用该编码。  Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。通常我们所遇到过多UTF-8这是Unicode编码的实现方式,请一定要加以区分。  GB2312字集是简体字集;BIG5字集是**繁体字集;GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号  GB18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了一个统一的标准。  Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是GB2312编码。  关于 ANSI、Unicode、Unicode big endian、UTF-8 这四种编码的解释:  ANSI编码:  unicode和ansi都是字符代码的一种表示形式。  为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 "中" 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。  不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。  不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。  Unicode 编码:  在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以呈现世界上数十种文字的系统。  Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standard,目前第五版由Addison-Wesley Professional出版,ISBN-10: 0321480910)对外发表。  Unicode 包含了超过十万个字符(在西元 2005 年, Unicode 的第十万个字符被采纳且认可成为标准之一)、一组可用以作为视觉参考的代码图表、一套编码方法与一组标准字符编码、一套包含了上标字、下标字等字符特性的列举等。Unicode 在字符集认可的成功,使其得以在电脑软件的国际化与本地化领域中,广泛且具优势的被采用。  这标准已在近年来的多种新科技当中被加以采用,包含了可扩展置标语言(XML)、Java编程语言、以及最新的操作系统中。  为什么使用Unicode?  基本上,计算机只是处理数字。它们指定一个数字,来储存字母或其他字符。在创造Unicode之前,有数百种指定这些数字的编码系统。没有一个编码可以包含足够的字符:例如,单单欧州共同体就需要好几种不同的编码来包括所有的语言。即使是单一种语言,例如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。这些编码系统也会互相冲突。也就是说,两种编码可能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么时候数据通过不同的编码或平台之间,那些数据总会有损坏的危险。  Unicode big endian和Unicode little endian  big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。  “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。  我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。  UTF_8 编码  UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。  恩,你看看,应该有帮助的O(∩_∩)O~
2023-06-10 00:58:101

《国际专利分类法》的体系结构

Big Endian 和 Little Endian [转]powerpc 发表于 2005-5-5 15:25:00 谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是 little endian呢? 其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。 用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:Big Endian 低地址 高地址 -----------------------------------------
2023-06-10 00:58:192

C++中的bitset的高阶位与低阶位?

这个其实我不懂
2023-06-10 00:58:286

[AS3]as3.0字符如何转换与unicode字符转换代码示例

设 i 为相应的Unicode,则trace( String.fromCharCode( i ) )就能输出你想要的字符。(好像来晚了……)
2023-06-10 00:58:412

java的一个问题

这些输出的是当前堆栈中的东西,有兴趣可以深入一下java的堆栈知识。
2023-06-10 00:59:142