10進数字から16進文字列への変換,および16進文字列から10進数字への変換の例題です。16進数のデータはchar型データの文字列として扱います。
//----------------------------------------------------------------- // 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]% |