此Microsoft文档中的字节/位顺序是什么?

问题描述 投票:0回答:1

这是Windows .lnk快捷方式格式的文档:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/16cb4ca1-9339-4d0c-a68d-bf1d6cc0f943

ShellLinkHeader结构的描述如下:

screenshot

这是文件:

screenshot

看着HeaderSize,字节为4c 00 00 00,应该表示76个十进制。这是一个小端序的整数,在这里不足为奇。

[接下来是具有字节01 14 02 00 00 00 00 00 c0 00 00 00的LinkCLSID,代表值“ 00021401-0000-0000-C000-000000000046”。 This answer似乎可以解释为什么字节顺序会发生变化,因为最后8个字节是字节数组,而其他字节是小尾数。

我的问题是关于[[LinkFlags部分。

LinkFlags部分的描述如下:

screenshot

并且我文件中的字节为9b 00 08 00,或为二进制:

9 b 0 0 0 8 0 0 1001 1011 0000 0000 0000 1000 0000 0000 ^

通过比较不同的文件,我发现在文档中用^标记的位是6 / G位(用红色标记)。

如何解释?字节的顺序与文档中的顺序相同,但是每个字节的位都反转了?

windows endianness
1个回答
0
投票
这里的问题源于所显示的位列表根本不适合其下的

number的事实。它的意思是在其下面容纳一个位列表,并且该列表从最低位到最高位,这是我们从左到右读取数字的完全相反的过程。

列表清楚地显示了从0到31的位,这意味着它确实是一个32位值,而不是四个字节。具体来说,这意味着在执行其他任何操作之前,原始读取的字节需要

解释为单个32位整数。与所有其他值一样,这意味着它需要以小尾数形式读取,其字节反转。

因此,您的9b 00 08 00变为0008009b,或者以二进制形式,0000 0000 0000 1000 0000 0000 1001 1011

但是,正如我所说,规格中的列表显示了从最低到最高的位。因此,要使它们适合于此,请反转二进制版本:

0 1 2 3 0123 4567 8901 2345 6789 0123 4567 8901 ABCD EFGH IJKL MNOP QRST UVWX YZ@_ ____ --------------------------------------- 1101 1001 0000 0000 0001 0000 0000 0000 ^

因此,在规格中以“ G”表示的第6位为0。

但是,如果您颠倒规格,并按逻辑顺序从最高到最低列出这些位,那么整个事情就更有意义了:

3 2 1 0 1098 7654 3210 9876 5432 1098 7654 3210 ____ _@ZY XWVU TSRQ PONM LKJI HGFE DCBA --------------------------------------- 0000 0000 0000 1000 0000 0000 1001 1011 ^

这使字母参考看起来不那么直观,但是它完全适合下面的二进制数字。这样,您还可以清楚地看到最高的5位未使用。
© www.soinside.com 2019 - 2024. All rights reserved.