10進・16進[文字列]の変換

10進数字から16進文字列への変換,および16進文字列から10進数字への変換の例題です。16進数のデータはchar型データの文字列として扱います。

10進・16進の変換(list_16.c)
//-----------------------------------------------------------------
// list_16.c:
//     10進[decimal]・16進[hexadecimal]の変換
//                 Last Update: <2005/06/03 16:04:17 A.Murakami>
//-----------------------------------------------------------------
#include <stdio.h>
#include <string.h>

//-----------------------------------------------------------------
int d2h(int d,char* buf);
int h2d(int n,char* buf);
//-----------------------------------------------------------------

int main()
{
    int i,ii,d,n;
    char cbuf[]="Akitsugu Murakami";
    char xbuf[]="41 6B 69 74 73 75 67 75 20 4D 75 72 61 6B 61 6D 69";
    char buf[256],seps[]=" ",*token;
    //--------------------------------------------------
    // 文字列を16進数字へ
    //--------------------------------------------------
    printf("**dec -> hex\n\t");
    for(i=0;i<strlen(cbuf);i++) printf("%X ",cbuf[i]);
    puts("");
    //--------------------------------------------------
    // 格納配列のバイト数を指定して変換[10進->16進->10進]
    //--------------------------------------------------
    printf("**dec -> hex -> dec\n");
    for(i=0;i<8;i++){
        for(d=1,ii=0;ii<i;ii++) d *= 16;
        d -= 1;
        n = d2h(d,buf);
        printf(" %10d -> %10s -> %10d\n",d,buf,h2d(n,buf));
    }
    //-------------------------------------------------d-
    // 16進文字列を char 型データとして表示
    //--------------------------------------------------
    printf("**hex -> dec\n\t");
    token = (char*)strtok(xbuf,seps);
    while(token!=NULL){
        printf("%c,",h2d(2,token));
        token = (char*)strtok(NULL,seps);
    }
    puts("");

    return 0;
}

int d2h(int d,char* buf)
{
    char c;
    int i,k=1,n=0;
    while((k<<=4) <= d) n++; n ++;
    for(i=0;i<n;i++){
        c = 0xf & (d>>(i*4));
        buf[n-i-1] = (c>9)?(c+'A'-10):(c+'0');
    }
    buf[n] = '\0';
    return n;
}

int h2d(int n,char* buf)
{
    int c,i,d=0;
    for(i=0;i<n;i++){
        c = buf[i] | 32;
        if(c >= '0' && c <= '9') c -= '0';
        if(c >= 'a' && c <= 'f') c -= ('a'-10);
        d += (c<<4*(n-i-1));
    }
    return d;
}

実行結果
Gami[847]% ./list_16.exe
**dec -> hex
        41 6B 69 74 73 75 67 75 20 4D 75 72 61 6B 61 6D 69
**dec -> hex -> dec
          0 ->          0 ->          0
         15 ->          F ->         15
        255 ->         FF ->        255
       4095 ->        FFF ->       4095
      65535 ->       FFFF ->      65535
    1048575 ->      FFFFF ->    1048575
   16777215 ->     FFFFFF ->   16777215
  268435455 ->    FFFFFFF ->  268435455
**hex -> dec
        A,k,i,t,s,u,g,u, ,M,u,r,a,k,a,m,i,
Gami[848]%
inserted by FC2 system