によって生成された USB I/O トラフィックのトレースを解読しようとしてusbmon
いますが、エンディアンについて頭を悩ませています。例として、私が使用しているトレースの 2 行を次に示します。
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
最初は、トレースにビッグエンディアン以外の疑いはまったくありませんでしたが、2 行目に、ベンダー IDと製品 IDda0b8781
を持つ、トレースしている USB デバイスの ID に対応するものを見つけました(注:トレース内のバイト順の反転)。 0x0bda
0x8187
したがって、この時点で、トレースの特定のフィールド内ではusbmon
、バイトは常に逆のバイト順であり、そのように解釈されるべきであると考えました。しかし逆に、最初のトレース ラインの終わり近くの小さな部分を調べてみましょう。... 0040 64
0040
受け入れられる最大応答サイズを表す 16 進フィールドです。 64
は、まったく同じものを表す 10 進数フィールドです。 0x0040
= 64
10 進数、バイト順を に切り替えることなく0x4000
、!= 64
10 進数になります。そのため、この時点で、usbmon
トレースのさまざまな部分のバイト順について少し不確かになり始めました。
usbmon
次に考えたのは、逆バイト順になっているのはトレースのデータ部分だけかもしれないということです。だから私は本当に読むべきだと思った
...12010002 00000040 da0b8781 00010102 0301
なので
1030 20101000 1878b0ad 04000000 20001021...
いいえ、それも正しくないようです。USB 仕様では、ベンダー ID (0x0bda
私の場合) は、この特定の文字列のバイト オフセット 8 にある必要があると規定されています。上記の文字列を元の順序のままにしておくと、ベンダー ID はバイト オフセット 8 から始まります (最初の 8 バイトを消費12010002 00000040
します)。しかし、上記のように逆にすると、バイト オフセット 6 から始まります (1030 20101000
最初の 6 バイト)。
したがって、私の最善の推測は、すべてのビッグエンディアンを表示し、各 4 バイトワード内でusbmon
逆のバイト順序に切り替わることを受け入れますが、データのみです。これが正しいかどうか、または私が見逃しているものが他にある可能性があるかどうかについて、誰かが明確にすることはできますか?