可変長数値表現
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
''[[FrontPage]]''
* 可変長数値表現を実装する [#tecf7608]
可変長数値表現とは、あらかじめ大きさの分からない数値を、...
オクテットのうち最上位ビットを、次のオクテットが続くかの...
したがって、127以下の数値が頻繁に登場するようなデータをフ...
有名なのは、Standard MIDI Fileのデルタ値表現である。~
~
今回は、INT型の数値を可変長数値表現で表すコードを載せてみ...
#ref(http://bj006.com/bjwiki/image/VLNE.png)
** C++による可変長数値表現のテスト [#c406bea4]
#include <stdio.h> ...
...
int numInBytes( unsigned char* vd_bytes, int vd_data ); ...
...
/* VLNE Test *******************************************...
int main( void ) ...
{ ...
int data = 0; ...
int byteCnt = 0; ...
int cnt = 0; ...
unsigned char bytes[4] = { 0, 0, 0, 0 }; ...
...
for( ; ; ) ...
{ ...
printf( "input >" ); ...
scanf( "%d", &data ); ...
...
byteCnt = numInBytes( bytes, data ); ...
...
for( ; byteCnt > cnt; cnt++ ) ...
{ ...
printf( "%#2x " , bytes[cnt] ); ...
} ...
...
break; ...
} ...
...
return( 0 ); ...
} ...
//*VLNE Test *******************************************...
/* Variable Length Numeric Expression ******************...
int numInBytes( unsigned char* vd_bytes, int vd_data ) ...
{ ...
int rtnNum = 0; ...
...
if( 0x7F >= vd_data ) ...
{ ...
vd_bytes[0] = (char)vd_data; ...
rtnNum = 1; ...
} ...
else if( 0x3FFF >= vd_data ) ...
{ ...
vd_bytes[0] = 0x80 | ((vd_data & 0x3F80) >> 7); ...
vd_bytes[1] = 0x7F & vd_data; ...
rtnNum = 2; ...
} ...
else if( 0x1FFFFF >= vd_data ) ...
{ ...
vd_bytes[0] = 0x80 | ((vd_data & 0x1FC000) >> 14...
vd_bytes[1] = 0x80 | ((vd_data & 0x3F80) >> 7); ...
vd_bytes[2] = 0x7F & vd_data; ...
rtnNum = 3; ...
} ...
else if( 0x0FFFFFFF >= vd_data ) ...
{ ...
vd_bytes[0] = 0x80 | ((vd_data & 0x0FE00000) >> ...
vd_bytes[1] = 0x80 | ((vd_data & 0x1FC000) >> 14...
vd_bytes[2] = 0x80 | ((vd_data & 0x3F80) >> 7); ...
vd_bytes[3] = 0x7F & vd_data; ...
rtnNum = 4; ...
} ...
...
return( rtnNum ); ...
} ...
//*Variable Length Numeric Expression ******************...
** 表示結果: [#a722e213]
input >16384
0x81 0x80 0
*** 修正履歴 [#scd64431]
~
*** 課題 [#g5834b51]
-備考~
~
*** 参考ページ [#bde7f346]
[[Wikipedia:http://ja.wikipedia.org/wiki/%E5%8F%AF%E5%A4%...
終了行:
''[[FrontPage]]''
* 可変長数値表現を実装する [#tecf7608]
可変長数値表現とは、あらかじめ大きさの分からない数値を、...
オクテットのうち最上位ビットを、次のオクテットが続くかの...
したがって、127以下の数値が頻繁に登場するようなデータをフ...
有名なのは、Standard MIDI Fileのデルタ値表現である。~
~
今回は、INT型の数値を可変長数値表現で表すコードを載せてみ...
#ref(http://bj006.com/bjwiki/image/VLNE.png)
** C++による可変長数値表現のテスト [#c406bea4]
#include <stdio.h> ...
...
int numInBytes( unsigned char* vd_bytes, int vd_data ); ...
...
/* VLNE Test *******************************************...
int main( void ) ...
{ ...
int data = 0; ...
int byteCnt = 0; ...
int cnt = 0; ...
unsigned char bytes[4] = { 0, 0, 0, 0 }; ...
...
for( ; ; ) ...
{ ...
printf( "input >" ); ...
scanf( "%d", &data ); ...
...
byteCnt = numInBytes( bytes, data ); ...
...
for( ; byteCnt > cnt; cnt++ ) ...
{ ...
printf( "%#2x " , bytes[cnt] ); ...
} ...
...
break; ...
} ...
...
return( 0 ); ...
} ...
//*VLNE Test *******************************************...
/* Variable Length Numeric Expression ******************...
int numInBytes( unsigned char* vd_bytes, int vd_data ) ...
{ ...
int rtnNum = 0; ...
...
if( 0x7F >= vd_data ) ...
{ ...
vd_bytes[0] = (char)vd_data; ...
rtnNum = 1; ...
} ...
else if( 0x3FFF >= vd_data ) ...
{ ...
vd_bytes[0] = 0x80 | ((vd_data & 0x3F80) >> 7); ...
vd_bytes[1] = 0x7F & vd_data; ...
rtnNum = 2; ...
} ...
else if( 0x1FFFFF >= vd_data ) ...
{ ...
vd_bytes[0] = 0x80 | ((vd_data & 0x1FC000) >> 14...
vd_bytes[1] = 0x80 | ((vd_data & 0x3F80) >> 7); ...
vd_bytes[2] = 0x7F & vd_data; ...
rtnNum = 3; ...
} ...
else if( 0x0FFFFFFF >= vd_data ) ...
{ ...
vd_bytes[0] = 0x80 | ((vd_data & 0x0FE00000) >> ...
vd_bytes[1] = 0x80 | ((vd_data & 0x1FC000) >> 14...
vd_bytes[2] = 0x80 | ((vd_data & 0x3F80) >> 7); ...
vd_bytes[3] = 0x7F & vd_data; ...
rtnNum = 4; ...
} ...
...
return( rtnNum ); ...
} ...
//*Variable Length Numeric Expression ******************...
** 表示結果: [#a722e213]
input >16384
0x81 0x80 0
*** 修正履歴 [#scd64431]
~
*** 課題 [#g5834b51]
-備考~
~
*** 参考ページ [#bde7f346]
[[Wikipedia:http://ja.wikipedia.org/wiki/%E5%8F%AF%E5%A4%...
ページ名: