【发布时间】:2012-07-31 02:32:10
【问题描述】:
我正在尝试破译usbmon 产生的 USB I/O 流量的踪迹,但我在处理字节序时遇到了一些问题。例如,以下是我正在使用的跟踪中的两行:
ffff8800650e7000 433121059 S Ci:2:000:0 s 80 06 0100 0000 0040 64 <
ffff8800650e7000 433121661 C Ci:2:000:0 0 18 = 12010002 00000040 da0b8781 00010102 0301
我最初在跟踪中除了大端顺序之外没有任何怀疑,但后来我在第二行看到da0b8781,它对应于我正在跟踪的 USB 设备的身份,其供应商 ID 为0x0bda 和 0x8187 的产品 ID(注意跟踪中字节顺序的反转)。
所以在这一点上,我认为可能在usbmon 跟踪的给定字段中,字节总是以相反的字节顺序进行解释,应该这样解释。但相反,让我们检查靠近第一条跟踪线末端的一小部分,... 0040 64
0040 是一个十六进制字段,表示接受的最大响应大小。 64 是一个十进制字段,应该代表完全相同的东西。 0x0040 = 64 十进制,不切换字节顺序 到 0x4000,然后 != 64 十进制。所以在这一点上,我开始对usbmon 跟踪的不同部分的字节顺序有点不确定。
接下来我想,也许只是usbmon 跟踪的数据部分以反向字节顺序排列。所以我想也许我真的应该阅读
...12010002 00000040 da0b8781 00010102 0301
作为
1030 20101000 1878b0ad 04000000 20001021...
不,这似乎也不对。 USB 规范声明供应商 ID(在我的例子中为 0x0bda)应该在这个特定字符串的字节偏移量 8 处。如果我们将上面的字符串保持原来的顺序,那么供应商 ID 确实从字节偏移量 8 开始(12010002 00000040 消耗前 8 个字节),但是如果我们像上面那样反转它,那么它从字节偏移量 6 开始( 1030 20101000 只消耗前 6 个字节)。
所以我现在最好的猜测是usbmon 显示所有大端,接受它切换到每个 4 字节字内 的反向字节顺序,但是对于仅限数据。任何人都可以澄清这是否正确,或者是否还有其他我遗漏的东西?
【问题讨论】:
标签: usb endianness