バイトで表現された10進数を変換
2016/04/06
バイトで表現された10進数を文字列と数値に変換します。
「バイトで表現された10進数」とは、0x01 は 1、0x21 は 21 と解釈するデータの事です。
16進数を10進数に変換するという考えでこのデータを見ると 0x01 は 1 ですが、0x21 は 10進数では 33となります。
そうではなく、今回の処理はバイトで表現された数値をそのまま10進数として解釈するようにしています。
変換方法で上手いロジックを考えられなかったので力技になってしまっています・・・
◆環境
OS |
Windows 7 Professional Service Pack 1 (64bit) |
VC |
Microsoft Visual C++ 2005 77972-235-2482122-41662 |
[ファイル]-[新規作成]-[プロジェクト]を選択します。
「プロジェクトの種類」欄で[Visual C++]-[Win32]を選択し、[Win32 コンソールアプリケーション]を選択します。
「プロジェクト名」は「HexToStrOrInt」にします。
HexToStrOrInt.cpp
|
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
|
// HexToStrOrInt.cpp : コンソール アプリケーションの
// エントリ ポイントを定義します。
//
// バイトで表現された10進数を文字列と数値に変換する
#include "stdafx.h"
#include "windows.h"
int ConvHexToStr ( BYTE* src, int iSrcLen, char* cDst );
char GetChar ( unsigned char c );
int ConvHexToInt ( BYTE* src, int iSrcLen, int* iDst );
int GetInt( unsigned char c );
int _tmain( int argc, _TCHAR* argv[] )
{
BYTE src[4] = { 0x20, 0x16, 0x04, 0x06 };
char cDst[(4*2)+1];
memset( cDst, 0x00, sizeof( cDst ) );
ConvHexToStr( src, 4, cDst );
printf( "cDst=[%s]\n", cDst );
int iDst;
ConvHexToInt( src, 4, &iDst );
printf( "iDst=[%d]\n", iDst );
getchar();
return 0;
}
int ConvHexToStr( BYTE* src, int iSrcLen, char* cDst )
{
unsigned char c;
for ( int i = 0; i < iSrcLen; i++ )
{
// 上位4ビットの抜き出し
c = src[i] >> 4;
printf( "%dU:[%x]\n", i, c );
cDst[(i*2)] = GetChar( c );
// 下位4ビットの抜き出し
c = src[i] & 0x0F;
printf( "%dD:[%x]\n", i, c );
cDst[(i*2)+1] = GetChar( c );
}
return 0;
}
char GetChar( unsigned char c )
{
switch( c )
{
case 0x00: return '0'; break;
case 0x01: return '1'; break;
case 0x02: return '2'; break;
case 0x03: return '3'; break;
case 0x04: return '4'; break;
case 0x05: return '5'; break;
case 0x06: return '6'; break;
case 0x07: return '7'; break;
case 0x08: return '8'; break;
case 0x09: return '9'; break;
default: exit(-1); break;
}
}
int ConvHexToInt( BYTE* src, int iSrcLen, int* iDst )
{
unsigned char c;
*iDst = 0;
for ( int i = 0; i < iSrcLen; i++ )
{
int iBuf = 0;
// 上位4ビットの抜き出し
c = src[i] >> 4;
printf( "%dU:[%x]\n", i, c );
iBuf = GetInt( c ) * 10;
// 下位4ビットの抜き出し
c = src[i] & 0x0F;
printf( "%dD:[%x]\n", i, c );
iBuf += GetInt( c );
printf( "iBuf=[%d]\n", iBuf );
if ( i > 0 )
{
// 1バイトで2桁分表現されているので
// 2桁繰り上げる。
*iDst *= 100;
}
*iDst += iBuf;
}
return 0;
}
int GetInt( unsigned char c )
{
switch( c )
{
case 0x00: return 0; break;
case 0x01: return 1; break;
case 0x02: return 2; break;
case 0x03: return 3; break;
case 0x04: return 4; break;
case 0x05: return 5; break;
case 0x06: return 6; break;
case 0x07: return 7; break;
case 0x08: return 8; break;
case 0x09: return 9; break;
default: exit(-2); break;
}
}
|
|
実行してみます。
0U:[2]
0D:[0]
1U:[1]
1D:[6]
2U:[0]
2D:[4]
3U:[0]
3D:[6]
cDst=[20160406]
0U:[2]
0D:[0]
iBuf=[20]
1U:[1]
1D:[6]
iBuf=[16]
2U:[0]
2D:[4]
iBuf=[4]
3U:[0]
3D:[6]
iBuf=[6]
iDst=[20160406]
変換できました。
▲ PageTop ■ Home
Copyright (C) 2016 ymlib.com