ビッグエンディアンとリトルエンディアンの意味とその変換方法
使用ソフトウェア: LabVIEW Development Systems>>Full Development System
使用ソフトウェア・バージョン: N/A
使用ソフトウェア・バージョンに特化: N/A
二次のソフトウェア: Other NI Software, Calibration Executive, DIAdem, LabVIEW Toolkits, LabWindows/CVI Add-ons, Measurement Studio Add-ons, LabVIEW Modules, LabVIEW Development Systems, LabWindows/CVI Development Systems, Measurement Studio, TestStand, Lookout, MATRIXx
問題: LabVIEWで保存したデータをCで読みとろうとしたのですが、うまくいきません。どうも、「エンディアン」という保存形式に問題があるようなのですが、よくわかりません。サンプルのようなものはありますか?
解決策: エンディアン(Endian)とは、マルチバイトのバイナリ数値を保存する方式のことを指します。
2バイト以上のデータ量を持つ数値データを記録したり転送するときには1バイトごとに分割され、これを最上位のバイト(MSB:Most Significant Bite)から順番に記録/送信する方式を「ビッグエンディアン」、反対に、最下位のバイト(LSB:Least Significant Bite)から順番に記録/送信する方式を「リトルエンディアン」といいます。
例:2バイト(16ビット)のバイナリ数値を、ビッグエンディアン/リトルエンディアン方式で保全する場合を考えます。
1という数字はビッグエンディアン方式(MSB LSB)では(00000000 00000001)とあらわされ、左端(16ビット目)が最上位ビットになります。リトルエンディアン方式(MSB LSB)では(00000001 00000000)とあらわされ、右から6ビット目のデータが最上位ビットになります。
| | U8で表現した"1" | U16で表現した"1" | SGL(単精度少数)の場合 | |
LabVIEW: |
"ビッグエンディアン" | (00000001) | (00000000 00000001) | (Byte4:Byte3:Byte2:Byte1) | |
(Win) C: |
"リトルエンディアン" | (00000001) | (00000001 00000000) | (Byte1:Byte2:Byte3:Byte4) | |
※アプリケーションや言語によって、リトルエンディアンを使用しているものと、ビッグエンディアンを使用しているものがあり、間違えると、まったく違ったデータとして、解釈してしまうことがあります。
Windowsなどのインテルチップを使用したコンピュータ(PC)はリトルエンディアン方式を使用しており、Macintoshコンピューターではビッグエンディアン方式を使用しています。LabVIEWは、もともとMacintoshで開発されたため現在でもビッグエンディアン方式を使用しています。ですから、LabVIEWで保存したバイナリデータをCやほかのWindowsのアプリケーションで読み取るときには、注意が必要です。
ビッグエンディアンとリトルエンディアンの変換方法ですが、以下に添付したVIを参照してください。
bin_file_write.viは、LabVIEWからファイルに書き込むときにバイトの順番を入れ替えます。
bin_file_read.viはデータを読み取るときに、バイトの順番を入れ替えるサンプルです。
タイプキャストと
1D配列転置の関数を使用してバイトの順番を入れ替えています。このサンプルはComplexとExtended以外のデータタイプすべてに使用できます。テスト用にさまざまなタイプで保存されているデータファイルも添付してあります。
bin_data_files.zip はLabVIEWで保存したもの、
bin_C_proj.zipはMicrosoft Visual C++で保存したものです。
それぞれのデータビットの詳細については以下のチュートリアル(
LabVIEW Data Storage)を参照してください。
関連リンク: LabVIEW Data Storage
添付:
- bin_file_write.vi - bin_file_read.vi
- bin_data_files.zip
- bin_C_proj.zip
報告日時: 05/31/2000
最終更新日: 10/17/2005
ドキュメントID: 1XU8RQPH