category: C / C++
DATE : 2006/11/26 (Sun)
DATE : 2006/11/26 (Sun)
BREW では機種によって CPU が異なるため、エンディアンが固定ではありません。そのため、バイナリデータを機種に依存せずに扱うには、エンディアンを機種に合わせて内部で変換しなければなりません。
機種のエンディアンに変換するには、以下のマクロ関数を使用します。(以下は BREW 3.1.2 API リファレンスから抜粋したものです)
- uint16 NTOHS(uint16 us)
- unsigned long NTOHL(unsigned long ul)
「N」はネットワークバイトオーダを表し、「H」は機種(ホスト)のエンディアンを表します。つまり「N」TO「H」とは、ネットワークバイトオーダから機種のエンディアンに変換する関数であることを表しています。
なお、ネットワークバイトオーダはビッグエンディアンとされています。そのため、バイナリデータをビッグエンディアンとしておけば、これらの関数を介すことで機種のエンディアンへの依存を防ぐことができます。
ところで、リファレンスを見るかぎりでは、NTOHS の扱うビット数は16ビットと定義されていますが、NTOHL は定義されていないように見えます。
しかし、NTOHL の定義(AEEStdLib.h)を覗いてみると、uint32 と定義されていました。
そのため、以下のように見なしても問題ないと思います。
- uint16 NTOHS(uint16 us)
- uint32 NTOHL(uint32 ul)
(逆に機種のエンディアンからネットワークバイトオーダに変換するマクロ関数もありますが、この記事では触れません)
PR
●この記事にコメントする
忍者ブログ [PR]