hnwの日記

BuffaloのUSB無線LANアダプタの返す製造元の文字列を解読する

私の手元に「Buffalo WLI-UC-AG300N」というUSB無線LANアダプタがあるのですが、Macの「システム情報」で見ると製造元が「敇瑭步挮浯䩟」となっていることに気づきました。

バッファローとかメルコとか書いてあるなら分かりますが、少なくとも日本語ではありませんし、簡体字なり繁体字なりだとしても不自然に思えます。となると、一体何が表示されているのでしょうか?文字コード警察的な意味で興味を持ったので、調べてみました。

謎解き(1) 何が書いてあるのか

この記事の執筆時点では「敇瑭步挮浯䩟」でGoogle検索しても同じ無線LANアダプタの情報が1件見つかるだけで、そんなメーカーは地球上に存在しなさそうなことがわかります。

ネット上にも情報が無いときに頼れるのは自分の直感だけです。そこで、私は謎の漢字列をUTF-16にしてみることにしました。

上記PHPファイルをUTF-8で保存して実行すると、次の文字列を得ます。

Gemtek.com_J

なんと7bitの可読文字が現れました。UTF-16は原則2バイトで1文字を表しますが、UTF-16の6文字を無作為抽出した場合に対応する12バイト全てがASCIIの7bit可読文字になる確率は0.0007%以下です。これは偶然なわけがありません。

この文字列のGemtekというのは台湾のメーカー「Gemtek Technology Co., Ltd」のことでしょう。同社はバッファロー社の無線LAN製品のOEM仕入れ先としても有名です。

実際、下記URLに「Buffalo WLI-UC-AG300N」のOEM元がGemtek社であることが書かれています。

そんなわけで、隠された文字列は「Gemtek.com_J」であることがわかりました。

謎解き(2) なぜ文字化けが起きたのか

さて、謎の漢字列はGemtek社を表すようですが、どうすればこんな不思議な文字化けが起きるのでしょうか?

実は、下記引用部の通り、USB 2.0の文字エンコーディングはUTF-16LEだと決められています。

Unicode ECN: Released in February 2005.
This ECN specifies that strings are encoded using UTF-16LE. USB 2.0 specified Unicode, but did not specify the encoding.

https://en.wikipedia.org/wiki/USB

つまり、USBで「abc」という文字列を表したい場合、「0x61 0x00 0x62 0x00 0x63 0x00」の6バイトにする必要があるわけです。これを知らずに(もしくは後で作業しようと思って忘れて)実装してしまうと、UTF-16としては不思議な文字列になるわけです。これが今回の文字化けの真相でしょう。

まとめ

WLI-UC-AG300Nの製造元文字列「敇瑭步挮浯䩟」について調べました。

  • 「敇瑭步挮浯䩟」は本来「Gemtek.com_J」となるはずだった
    • これは台湾のメーカーGemtek社を意味する
  • USBの仕様上UTF-16LEで記述すべきところをASCIIで記述したため文字化けが起きた

イースターエッグ的なものである可能性もゼロではありませんが、受託ビジネスでそんな無駄なリスクは取らないと思います。