忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

データ分解のアルゴリズム

克兎です。
3連休は身内ネタで全然休めてません。
遊びたいです。

今回、データをバイト単位で分解する上でのアルゴリズムを
メモ程度に書いて行きたいと思います。

拍手[1回]



データをバイト単位で分解するのは意外と意味があります。

例えば、複数のデータを一つでまとめたい時、
本来なら構造体を使うのがセオリーですが、
構造体は中に入る型が、事前にわかっていないといけません。

しかし、一度バイト単位に分割してやれば、
あとは、好きなデータ順に配列化してやるだけで、動的な構造体を作ることができます。

一番シンプルな方法は、

main.cpp

int main(){

 int Data = 20;
 char* pData = static_cast< char* >( static_cast< void* >( &Data ) );

 for( int i = 0 ; i < sizeof( int ) ; i ++ ){

  printf( "%03d " , pData[ i ] );

 }
 return 1;
}


のように、キャストを使って強制的に、バイト単位で閲覧できるようにする方法です。
これで、pDataは、4つの要素を持った配列として扱えます。

しかし、この方法では、2連続でキャストするせいで、非常に冗長的なソースになってしまいます。
内部的には、C++のキャストはチェックが入っているので、
多様しないほうがパフォーマンス良いのも事実です。

なので、その点を考慮した、バイト分解を考えてみました。

main.cpp

template< class TYPE >
struct ByteRslv{

 ByteRslv() : pData( &Byte ){}

 union{

  TYPE Data;
  char Byte;

 };

 char* pData;

};

int main(){

 ByteRslv< int > test;

 test.Data = 20;

 for( int i = 0 ; i < sizeof( int ) ; i ++ ){

  printf( "%03d " , test.pData[ i ] );

 }

 return 1;
}
 

テンプレートで型を指定し、
共用体で、メモリをchar型に変換しています。
初期化リストでそのアドレスをコピーしておけば、あとはそのポインタが配列として扱えます。
バイト分割されることがわかっているデータならこのようなクラスを作っておくのもいいかもしれません。

そ~れ~で~は~(*'∀`)ノ

PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]