解释(缺乏)字节顺序,因为它适用于字符串
Explaining (lack of) endianness as it applies to a string
对于这个问题,我假设每个字符都是单字节 ascii。如果我的理解是正确的,字节顺序适用于多字节字的字节顺序。因为字符串每个字符只有一个字节,所以没有字节顺序。
但这让我有点困惑,因为字符串通常在字符串的 'end' 处与 nul
字符一起存储,这在字节序方面不是很重要吗?例如,
.data
my_string: .asciz "Save"
现在在 gdb
打印 S
a
v
e
:
的内存位置
>>> x/cb &string
0x4000b9: 'S'
>>> x/cb (char *) &string+1
0x4000ba: 'a'
>>> x/cb (char *) &string+2
0x4000bb: 'v'
>>> x/cb (char *) &string+3
0x4000bc: 'e' # LSB at highest memory address (big endian??)
这里的字符串本质上不就是'big endian'因为最低有效字节(e
)存储在最高内存地址(string+3
)吗?
关于字节序如何适用于或不适用于字符串,我遗漏了什么部分?我想也许我可能将字符数组索引误认为是字节序,但明确指出这一点的答案会很棒。
字节顺序只能存在于您作为单个字节访问的数据 和 具有更大的访问大小。如果您正在对字符串数据进行 DWORD 加载,字节顺序将决定 register &= 0xFF
是否会隔离字符串的第一个或最后一个字符。 (在 x86 上,movzx edx, al
会隔离第一个字节,因为 x86 是 little-endian:lower-address 字节最终位于寄存器中更接近 right-shifted 的位置。)
如果您不这样做,而只是查看每个字节的地址,则字节序的整个概念都不适用。字节的顺序由它们的地址决定。在末尾包括 ASCII NUL '[=12=]'
aka 0
字节。这方面没什么特别的。
本例中的地址space是基于字节的,各个地址指向字节。所以你不能有一个字节数的字节顺序,它必须是多个字节。
如果你有
0x1000 'S' (0x53)
0x1001 'a' (0x61)
0x1002 'v' (0x76)
0x1003 'e' (0x65)
那里没有字节序。字符串是在连续地址中线性表示内存中字符的单个字节。
如果您要检查这些 BYTES,不再作为字符而是作为具有 32 位 WORD 视图的字节,那么
0x1000: 0x53617665 is a typical big endian view
0x1000: 0x65766153 is a typical little endian view
对于地址 0x1000 处的相同数据,当您进行 32 位读取时。此时这不是字符串,它是在某个地址一次查看 32 位的字节。如果您尝试 view/use 数据作为字节和更大的数量,出于某种原因同一数据的两个视图,这是一个 AND 的事情。 ASCII 字符串不是我们所看到的那样。
注意字符串、整数、浮点数、布尔值、地址,所有数据类型都与处理器无关,位是位,它们仅在使用时对处理器和用户有意义。否则它们只是没有意义的比特。您可以通过像 memcpy() 一样进行单词读写来“复制”a(n ASCII)“字符串”,是的,对您来说它是一个字符串,但它只是被复制的字节,例如。大端或小端无关紧要所有字节都被分组提取和放下,当该处理器及其寻址将其视为线性字节串时,它仍然看起来像一个字符串。
这些基于具有不同字节序模式的处理器和我肯定经历过但不需要在这里混淆的各种其他 a-typical 情况的一般陈述有例外。一般理解是,低地址字节是访问中大小为多个字节(16 位、32 位、64 位等)的最高有效字节(大端字节序)或最低有效字节(小字节序字节序)。假设一个字节对于您的系统是 8 位,9 和其他大小的字节不会改变这只会改变访问的大小。
字节序的最大问题是人们试图将其过度复杂化。 “天哪,这是一个 X 端处理器,我已经习惯了 Y 端处理器,这会让我的生活变得困难,我将不得不玩寻址游戏,并做所有这些额外的工作。”不,一般来说,你只是制造了一个不存在的问题,现在你有必须修复的错误。
正确的答案是先了解系统,不要去想那个e-word,然后当你看到总线或外围设备及其接口或数据对象时,你需要从网络或文件系统等。然后你将它们与你计算机的 e-word 进行比较,并从系统工程的角度决定如果我对这个东西进行这种访问,这是否已经适合这个系统的 e-word,或者做我需要移动或字节交换或以其他方式转换数据,以便当我对该数据执行操作 X 时,它是正确的。如果您不必执行实际操作、添加一些数字等,您甚至关心吗?如果你只是简单地将数据从A点传输到B点,并且系统工程显示不需要数据操作(从硬盘读取文件并通过网络传输),那么你不需要考虑或谈论关于 e-word.
对于这个问题,我假设每个字符都是单字节 ascii。如果我的理解是正确的,字节顺序适用于多字节字的字节顺序。因为字符串每个字符只有一个字节,所以没有字节顺序。
但这让我有点困惑,因为字符串通常在字符串的 'end' 处与 nul
字符一起存储,这在字节序方面不是很重要吗?例如,
.data
my_string: .asciz "Save"
现在在 gdb
打印 S
a
v
e
:
>>> x/cb &string
0x4000b9: 'S'
>>> x/cb (char *) &string+1
0x4000ba: 'a'
>>> x/cb (char *) &string+2
0x4000bb: 'v'
>>> x/cb (char *) &string+3
0x4000bc: 'e' # LSB at highest memory address (big endian??)
这里的字符串本质上不就是'big endian'因为最低有效字节(e
)存储在最高内存地址(string+3
)吗?
关于字节序如何适用于或不适用于字符串,我遗漏了什么部分?我想也许我可能将字符数组索引误认为是字节序,但明确指出这一点的答案会很棒。
字节顺序只能存在于您作为单个字节访问的数据 和 具有更大的访问大小。如果您正在对字符串数据进行 DWORD 加载,字节顺序将决定 register &= 0xFF
是否会隔离字符串的第一个或最后一个字符。 (在 x86 上,movzx edx, al
会隔离第一个字节,因为 x86 是 little-endian:lower-address 字节最终位于寄存器中更接近 right-shifted 的位置。)
如果您不这样做,而只是查看每个字节的地址,则字节序的整个概念都不适用。字节的顺序由它们的地址决定。在末尾包括 ASCII NUL '[=12=]'
aka 0
字节。这方面没什么特别的。
本例中的地址space是基于字节的,各个地址指向字节。所以你不能有一个字节数的字节顺序,它必须是多个字节。
如果你有
0x1000 'S' (0x53)
0x1001 'a' (0x61)
0x1002 'v' (0x76)
0x1003 'e' (0x65)
那里没有字节序。字符串是在连续地址中线性表示内存中字符的单个字节。
如果您要检查这些 BYTES,不再作为字符而是作为具有 32 位 WORD 视图的字节,那么
0x1000: 0x53617665 is a typical big endian view
0x1000: 0x65766153 is a typical little endian view
对于地址 0x1000 处的相同数据,当您进行 32 位读取时。此时这不是字符串,它是在某个地址一次查看 32 位的字节。如果您尝试 view/use 数据作为字节和更大的数量,出于某种原因同一数据的两个视图,这是一个 AND 的事情。 ASCII 字符串不是我们所看到的那样。
注意字符串、整数、浮点数、布尔值、地址,所有数据类型都与处理器无关,位是位,它们仅在使用时对处理器和用户有意义。否则它们只是没有意义的比特。您可以通过像 memcpy() 一样进行单词读写来“复制”a(n ASCII)“字符串”,是的,对您来说它是一个字符串,但它只是被复制的字节,例如。大端或小端无关紧要所有字节都被分组提取和放下,当该处理器及其寻址将其视为线性字节串时,它仍然看起来像一个字符串。
这些基于具有不同字节序模式的处理器和我肯定经历过但不需要在这里混淆的各种其他 a-typical 情况的一般陈述有例外。一般理解是,低地址字节是访问中大小为多个字节(16 位、32 位、64 位等)的最高有效字节(大端字节序)或最低有效字节(小字节序字节序)。假设一个字节对于您的系统是 8 位,9 和其他大小的字节不会改变这只会改变访问的大小。
字节序的最大问题是人们试图将其过度复杂化。 “天哪,这是一个 X 端处理器,我已经习惯了 Y 端处理器,这会让我的生活变得困难,我将不得不玩寻址游戏,并做所有这些额外的工作。”不,一般来说,你只是制造了一个不存在的问题,现在你有必须修复的错误。
正确的答案是先了解系统,不要去想那个e-word,然后当你看到总线或外围设备及其接口或数据对象时,你需要从网络或文件系统等。然后你将它们与你计算机的 e-word 进行比较,并从系统工程的角度决定如果我对这个东西进行这种访问,这是否已经适合这个系统的 e-word,或者做我需要移动或字节交换或以其他方式转换数据,以便当我对该数据执行操作 X 时,它是正确的。如果您不必执行实际操作、添加一些数字等,您甚至关心吗?如果你只是简单地将数据从A点传输到B点,并且系统工程显示不需要数据操作(从硬盘读取文件并通过网络传输),那么你不需要考虑或谈论关于 e-word.