我正在读Chris Adamson的《学习核心音频:Mac和iOS音频编程实践指南》,作者曾将big endian描述为:
字节或字的高位在数字上比低位更重要。
然而,到目前为止,我认为大小端的问题只适用于字节顺序,而不适用于位顺序。无论我们讨论的是小端系统还是大端系统,一个字节都有相同的位顺序(从左到右)。我错了吗?作者错了吗?还是我误解了他的意思?
这不是对所述问题的回答——其他人已经很好地回答了这个问题——而是解释一些术语的脚注,希望澄清相关概念。特别是,这完全不是c所特有的。
>
Endianness和字节顺序
当大于字节的值被存储或序列化为多个字节时,组件字节存储顺序的选择称为字节顺序或endianness或endianness。
历史上,有三个字节顺序在使用:“big-endian”、“little-endian”和“PDP-endian”或“middle-endian”。
Big-endian和little-endian字节顺序名称源自它们对字节的排序方式:Big-endian将最高有效字节(对逻辑值影响最大的字节)放在第一位,连续字节按重要性降序排列;little endian将最低有效字节放在第一位,连续字节按重要性递增的顺序排列。
请注意,整数类型和浮点类型的字节顺序可能不同;它们甚至可以在单独的硬件单元中实现。不过,在大多数硬件上,它们确实具有相同的字节顺序。
位序
位序与endianness的概念非常相似,只是它涉及单个位而不是字节。这两个概念是相关的,但并不相同。
位顺序仅在位被序列化时才有意义,例如通过串行或SPI或I2C总线;一个接一个
当比特被称为并行使用的更大组中的一个单元时,就像在一个字节或一个字中一样,没有顺序:只有标记和意义。(这是因为它们是作为一个群体并行访问和操纵的,而不是一个接一个地连续访问和操纵的,所以没有特定的顺序。它们作为一个群体的解释对每个人都有不同的意义,为了便于参考,我们人类可以给它们贴上标签或编号。)
比特意义
当一组位被视为二进制值时,有一个最低有效位和一个最高有效位。这些名称来源于这样一个事实,即如果您更改最低有效位,则位组的值更改可能的最小量;如果您更改最高有效位,则位组的值更改可能的最大量(由单位变化)。
假设有一组五位,比如a、b、c、d和e,它们构成一个五位无符号整数值。如果a是最显著的,e是最不显著的,其他三个按显著性递减的顺序排列,则无符号整数值为
换句话说,位的重要性是从一组位的数学(或逻辑)解释中推导出来的,它完全独立于在某些总线上对位进行序列化的顺序,也独立于任何人类指定的标签或数字。
这适用于逻辑上构造数值的所有位组,即使是浮点数
位标签或位编号
例如,为了便于在文档中引用,标记单个位通常很有用。这基本上是武断的;事实上,我在上面的例子中使用了字母a到f。通常情况下,数字比字母更容易——用单个字母标记超过27位并不是那么容易。
有两种方法可以用数字标记位。
目前最常见的方法是根据位的重要性来标记位,位0表示最低有效位。这很有用,因为位i随后具有逻辑值2i。
在某些体系结构的文档中,如IBM的POWER文档中,最重要的位标记为0,按重要性的降序排列。在这种情况下,位的逻辑值取决于该单元中的位数。如果一个单元有N位,那么位i的逻辑值为2N-i-1。
虽然这种排序可能感觉很奇怪,但这些架构都是大端的,对人类来说,记住/假设这些系统中最重要的第一个可能是有用的。
但是,请记住,这是一个完全任意的决定,在这两种情况下,文档都可以使用其他位标记方案编写,而不会对系统的实际性能产生任何影响。这就像选择是从左到右,还是从右到左(或自上而下),只要你知道并理解惯例,内容就不会受到影响
虽然字节顺序和位标记之间存在一定的相关性,但上述四个概念都是独立的。
字节顺序和位标记之间存在相关性——从某种意义上说,许多大端硬件的留档使用位标记,其中最有效的位是位零——但这只是因为人类做出的选择。
在c中,C编译器在结构中打包位字段的顺序因编译器和体系结构而异。它根本不是C标准规定的。正因为如此,将二进制文件读入带比特域的结构类型通常是个坏主意。(即使它在某些特定的机器和编译器上工作,也不能保证它在其他机器和编译器上工作;通常情况下,它不会。所以,它肯定会使代码不那么可移植。)取而代之的是,读入缓冲区和无符号字符数组,并使用辅助访问器函数使用位移位从数组中提取位字段(
“位顺序”的唯一含义是位分配给位字段的顺序。例如,在:
union {
struct {
unsigned char a:4;
unsigned char b:4;
} bf;
unsigned char c;
};
根据具体实现,bf的表示形式。a
可以占用c
的高位四位,或者c
的低位四位。位字段成员的顺序是否与字节顺序匹配由实现定义。
由于通常无法单独寻址一个字节内的位,因此通常没有“位endpoint”的概念。
我正在开发一个程序,在这个程序中,我将一些数据存储在一个整数中,并按位进行处理。例如,我可能会收到数字48,我会一点一点地处理它。一般来说,整数的endian取决于整数的机器表示,但是Python是否能保证整数始终是小endian?或者我需要像在C中一样检查endianness,然后为这两种情况编写单独的代码吗? 我问这个问题是因为我的代码运行在一台Sun机器上,虽然它现在运行的机器使用的是英特尔
问题内容: 在我的JavaScript代码中,我需要以以下格式编写一条消息到服务器: 例: 数据可能包含unicode字符。我需要将它们作为UTF-8发送。 我正在寻找最跨浏览器的方法来计算JavaScript中字符串的长度(以字节为单位)。 我已经尝试过以此来组成我的有效载荷: 但是对于较旧的浏览器(或者,也许是UTF-16中的那些浏览器中的字符串?),它不能为我提供准确的结果。 有什么线索吗?
对不起,如果这个问题是一个迟钝的,但我没有得到一个答案,我正在寻找。 Java docs这样说 通常,对读取器的每个读取请求都会导致对底层字符或字节流的相应读取请求。因此,建议将BufferedReader包装在任何读取()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。例如, 将缓冲来自指定文件的输入。如果不进行缓冲,每次调用read()或rea
问题内容: 我正在尝试在Java字节变量中设置位。它确实提供了类似的适当方法。有人知道我该怎么实现吗? 我可以逐位遍历给定的字节: 但是我不能将此位置设置为1或0,可以吗? 问题答案: 使用按位 OR ()和 AND ()运算符。要设置一点,即将其转到: 取消设置或将其转到: 有关示例,请参见高级Java /按位运算符。
问题内容: 如果要通过MySQL添加列,则可以使用AFTER修饰符指定该列在表中的位置。但是,如果我通过Rails迁移执行add_column,则该列将在表的末尾创建。 Rails迁移有任何功能来指定添加列的位置吗? 问题答案: 现在可以在Rails 2.3.6+中通过传递:after参数来实现 https://rails.lighthouseapp.com/projects/8994/ticke
问题内容: UTF-8字符串可以包含零字节吗?我要通过ascii纯文本协议发送它,是否应该使用base64之类的东西对其进行编码? 问题答案: 是的,UTF8中的零字节是代码点0,NUL。有没有将在UTF8与在它一个零字节的任何位置进行编码等Unicode代码点。 可能的代码点及其UTF8编码为: 您可以看到,所有非零ASCII字符都被表示为自己,而所有多字节序列的所有字节均具有1的高位。 您可能