プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

16進文字列と整数値の相互変換

2012年04月22日 10時18分04秒 | アルゴリズム関連

16進文字列と整数値の相互変換を紹介します。(戻る)

アルゴリズム

ここでは16進数の文字列と整数値の相互変換する関数を3つ紹介してます。
文字列から整数値に変換する場合は、文字列の先頭から[0]~[9]、[A]~[F]、[a]~[f]の文字を解読してきます。
桁上がりは16倍する代わりに4ビットだけ左シフトすることで同じ効果を行ってます。

整数値から文字列に変換する場合は、整数値の下位桁から[0]~[15]の余りを解読してきます。
余りを求めるのに16で割る代わりに4ビットのビット論理積を使ってます。(ちょっとだけ高速)
この余りから[0]~[9]、[A]~[F]の文字に変換して文字列バッファ(lpBuff)にコピーします。
しかし、このままでは文字列が左右反転してるので戻すために左右並びを反転させます。

このときに出力桁数分だけスペース文字などを文字列バッファ(lpBuff)にコピーします。
こうすることで文字列バッファ(lpBuff)の先頭に出力桁数に見合うスペース文字で埋められます。
なお、スペース文字の代わりに[0]の文字で埋めたり、接頭語(0x)もコピーするように改良も可能です。

接頭語(0x)を出力するときには[x][0]の順にコピーしたり、出力桁数から2文字分だけ引いた残りが
スペース文字(ゼロ文字)で埋める出力桁数になることに気をつけましょう。
今回は接頭語(0x)は出力しません。

//------------------------------------------------
// 関数のプロトタイプ宣言
//------------------------------------------------
extern   UINT funcHexToInt( LPCTSTR lpString );
extern LPTSTR funcIntToHex( LPTSTR lpBuff, UINT nValue );
extern LPTSTR funcIntToHexEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace );

サンプル

//------------------------------------------------------------------------------
// 16進文字列と整数値の相互変換
//------------------------------------------------------------------------------
#include <stdio.h>
#include <tchar.h>
#include <ctype.h>
#include <wctype.h>
#include <locale.h>
#include <Windows.h>

//------------------------------------------------
// 16進文字列から整数値に変換
//------------------------------------------------
extern UINT funcHexToInt( LPCTSTR lpString )
{
    UINT nRet;
    
    for ( nRet = 0 ; _istxdigit(*lpString) ; lpString++ ){
        if ( _istdigit(*lpString) ){
            nRet <<= 4;
            nRet  |= (*lpString - TEXT('0'));
        }
        else if ( _istupper(*lpString) ){
            nRet <<= 4;
            nRet  |= (*lpString - 'A' + 10);
        }
        else{
            nRet <<= 4;
            nRet  |= (*lpString - 'a' + 10);
        }
    }
    return nRet;
}

//------------------------------------------------
// 文字列の左右並びを反転
//------------------------------------------------
static VOID funcStrReverse( LPTSTR lpHead, LPTSTR lpTail )
{
    TCHAR tcSwap[ 1 ];
    
    for ( *lpTail-- = TEXT('\0') ; lpHead < lpTail ; lpHead++, lpTail-- ){
        tcSwap[ 0 ] = lpHead[ 0 ];
        lpHead[ 0 ] = lpTail[ 0 ];
        lpTail[ 0 ] = tcSwap[ 0 ];
    }
}

//------------------------------------------------
// 整数値から16進文字列に変換
//------------------------------------------------
extern LPTSTR funcIntToHex( LPTSTR lpBuff, UINT nValue )
{
    LPTSTR lpTail;
    
    if ( nValue == 0 ){
        lpBuff[0] = TEXT('0');
        lpBuff[1] = TEXT('\0');
        return lpBuff;
    }
    for ( lpTail = lpBuff ; nValue ; nValue >>= 4 ){
        *lpTail++ = TEXT("0123456789ABCDEF")[ nValue & 0xF ];
    }
    funcStrReverse( lpBuff, lpTail );
    return lpBuff;
}

//------------------------------------------------
// 文字列の左右並びを反転
//------------------------------------------------
static VOID funcStrReverseEx( LPTSTR lpHead, LPTSTR lpTail, LONG nWidth, TCHAR tcSpace )
{
    TCHAR tcSwap[ 1 ];
    
    while ( nWidth > 0 ){
        nWidth--; *lpTail++ = tcSpace;
    }
    for ( *lpTail-- = TEXT('\0') ; lpHead < lpTail ; lpHead++, lpTail-- ){
        tcSwap[ 0 ] = lpHead[ 0 ];
        lpHead[ 0 ] = lpTail[ 0 ];
        lpTail[ 0 ] = tcSwap[ 0 ];
    }
}

//------------------------------------------------
// 整数値からn桁16進文字列に変換
//------------------------------------------------
extern LPTSTR funcIntToHexEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace )
{
    LPTSTR lpTail = lpBuff;
    
    if ( nValue == 0 ){
        nWidth--; *lpTail++ = TEXT('0');
    }
    else for ( ; nValue ; nValue >>= 4 ){
        nWidth--; *lpTail++ = TEXT("0123456789ABCDEF")[ nValue & 0xF ];
    }
    funcStrReverseEx( lpBuff, lpTail, nWidth, tcSpace );
    return lpBuff;
}

//------------------------------------------------
// メイン関数
//------------------------------------------------
int _tmain( void )
{
    LPCTSTR     lpHex1 = TEXT("75BCD15");
    LPCTSTR     lpHex2 = TEXT("0x75BCD15");
    TCHAR       szBuff[ 256 ];
    LONG        nValue;
    LONG        nWidth = 8;
    TCHAR       tcSpace = TEXT('0');
    
    // ロケールの設定
    _tsetlocale( LC_ALL, TEXT("") );
    // 文字列→整数値
    _tprintf( TEXT("\n// 16進文字列から整数値に変換\n") );
    _tprintf( TEXT("%10s = %ld\n"), lpHex1, funcHexToInt(lpHex1) );
    _tprintf( TEXT("%10s = %ld\n"), lpHex2, funcHexToInt(lpHex2) );
    // 整数値→文字列
    _tprintf( TEXT("\n// 整数値から16進文字列に変換\n") );
    for ( nValue = 0 ; nValue < 32 ; nValue++ ){
        _tprintf( TEXT("%2ld = [%s]\n"), nValue, funcIntToHex(szBuff,nValue) );
    }
    // 整数値→文字列(n桁)
    _tprintf( TEXT("\n// 整数値から16進文字列に変換\n") );
    for ( nValue = 0 ; nValue < 32 ; nValue++ ){
        _tprintf( TEXT("%2ld = [%s]\n"), nValue, funcIntToHexEx(szBuff,nValue,nWidth,tcSpace) );
    }
    return 0;
}

//------------------------------------------------------------------------------
// End of funcHexToInt.cpp
//------------------------------------------------------------------------------

実行結果

// 16進文字列から整数値に変換
   75BCD15 = 123456789
 0x75BCD15 = 0

// 整数値から16進文字列に変換
 0 = [0]
 1 = [1]
 2 = [2]
 3 = [3]
 4 = [4]
 5 = [5]
 6 = [6]
 7 = [7]
 8 = [8]
 9 = [9]
10 = [A]
11 = [B]
12 = [C]
13 = [D]
14 = [E]
15 = [F]
16 = [10]
17 = [11]
18 = [12]
19 = [13]
20 = [14]
21 = [15]
22 = [16]
23 = [17]
24 = [18]
25 = [19]
26 = [1A]
27 = [1B]
28 = [1C]
29 = [1D]
30 = [1E]
31 = [1F]

// 整数値から16進文字列に変換
 0 = [00000000]
 1 = [00000001]
 2 = [00000002]
 3 = [00000003]
 4 = [00000004]
 5 = [00000005]
 6 = [00000006]
 7 = [00000007]
 8 = [00000008]
 9 = [00000009]
10 = [0000000A]
11 = [0000000B]
12 = [0000000C]
13 = [0000000D]
14 = [0000000E]
15 = [0000000F]
16 = [00000010]
17 = [00000011]
18 = [00000012]
19 = [00000013]
20 = [00000014]
21 = [00000015]
22 = [00000016]
23 = [00000017]
24 = [00000018]
25 = [00000019]
26 = [0000001A]
27 = [0000001B]
28 = [0000001C]
29 = [0000001D]
30 = [0000001E]
31 = [0000001F]
  • funcHexToInt 関数は接頭語(0x)を解釈しないので付けると 0 になります。(仕様)
  • funcIntToHex 関数は単純に整数値から16進文字列に変換してます。
  • funcIntToHexEx 関数は出力桁数と出力文字を指定して16進文字列に変換してます。
    実はこの関数が本命で funcIntToHex 関数は理解しやすいように載せたものです。
←前へ] [目次] [次へ→

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 10進文字列と整数値の相互変換 | トップ | n進文字列と整数値の相互変換 »
最新の画像もっと見る

コメントを投稿

アルゴリズム関連」カテゴリの最新記事