人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

global navigation menu page top

リトルエンディアンに変換 -超簡単!【C言語・自作】

f:id:hiro-htm877:20190601191549p:plain

 

f:id:hiro-htm877:20190601202549p:plain

 

 「リトルエンディアン、ビッグエンディアンって何?」

「自分のパソコンのエンディアンを知りたい!」

 

 

そんな方はまず下の記事をご覧ください。

 

www.hiro877.com

 

今回は 自分でリトルエンディアンに変換します!

 

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

【完全初心者向け】リトルエンディアンに変換!

 

トルエンディアンとは、 

トルエンディアン(littele endian

ー 最下位ビットが存在するbyteを低位のアドレスへ格納していく方式(バイナリダンプでは「逆順」で見える)

f:id:hiro-htm877:20190612215922j:plain

トルエンディアン変換!

アルゴリズム

トルエンディアン変換プログラム作成

1. 下位8ビットをアンドマスクで取り出す

2. 8ビット右シフトを行い、1、2を繰り返す。

3. 順次、アンドマスクで取り出したビットを変数に格納し、8ビット左シフトを繰り返す

トルエンディアン変換プログラム実装!

1.  int src = 0x012345678;

 ←int型の16進数を宣言

2. int and_mask = 0xff;

 ←下位8ビットのアンドマスクを宣言

3.  while(src != 0x00){

 ←srcが0x00になるまでループ

4.  little_endian += (src & and_mask);

 ←下位8ビットを取り出す

5.  src = src >> 8;

 ←8ビット右シフトでかい8ビットを削除

6.  little_endian = little_endian << 8;

 ←8ビット左シフトで下位ビットを上位ビットへ移動

code
while(src != 0x00){
        little_endian += (src & and_mask);
        printf("0x%x\n", little_endian);
        src = src >> 8;
        little_endian = little_endian << 8;
    }
出力 

0x78

0x7856

0x785634

0x78563412

完成です!

トルエンディアン変換プログラムを実装しました。

 

ビットシフトをうまく使うことで簡単に実装できました。

私が苦しまされたエンディアン問題、皆さんもエンディアンには注意して下さい!

 

main文を含む全ソースコードは以下に示します。 

ソースコード

#include <stdio.h>
void enshu0613(void);
int main() {
    enshu0613();
    return 0;
}
void enshu0613(void){
    int src = 0x012345678;
    int little_endian=0x00;
    int and_mask = 0xff;
    
    while(src != 0x00){
        little_endian += (src & and_mask);
        printf("0x%x\n", little_endian);
        src = src >> 8;
        little_endian = little_endian << 8;
    }
}