close
updated 2009/02/14
更新並加入一些功能 V1.2
應該會是相當實用的小工具(最近自己很常用)
updated 2008/12/06
做一點小改版
這陣子剛剛入門BCB,有別於之前都是在寫韌體都是用C語言
這次要用C++寫視窗介面程式
這是我為自己定的一個小功課 -- Ascii 轉16進制 & 16進制轉Ascii
上面是我草寫的小工具,以下參考看看我的寫法吧
高手們還請多指教
◎輸入字元,以16進制字元輸出
void __fastcall TRANSCHAR::BytesToStr(unsigned long len ,char *_from ,char *_dest) { char *p_str; unsigned long i; int tmp; p_str = _from;
for(i=0 ;i<len ;i++)
{
tmp = (*p_str & 0xF0) >> 4;
*_dest++ = (tmp <= 9) ? tmp+'0':(tmp-10)+'A';
tmp = *p_str & 0x0F;
*_dest++ = (tmp <= 9) ? tmp+'0':(tmp-10)+'A';
*_dest++ = ' '; //加入空格區隔
p_str++;
}
*_dest++ = 0; }
_from指向輸入的字元,副程式中將位址給p_str處理,len為輸入的長度,轉換的結果指向_dest,轉換的結果由_dest取得
◎輸入16進制字元,輸出對應的ASCII字元
char __fastcall TRANSCHAR::HexToStr(char *hex_str) { int hex_int; char temp[2]; sscanf(hex_str ,"%X" ,&hex_int); sprintf(temp ,"%c" ,hex_int); return *temp; }
將16進制字串丟進去會回傳對應的ASCII,例如: char a[3]="41"; char b=HexToStr(a);
此時b會得到'A'
寫好了這2個基本Function,就可以來完成主程式了
void __fastcall TForm1::Btn_Asc2HexClick(TObject *Sender) { int len; char show_box[4096]; len = Memo1->Text.Length(); //取得輸入長度 Trans->BytesToStr(len ,Memo1->Text.c_str() ,show_box); //轉換成ASCII字元 Memo2->Text = show_box; Label1->Caption = IntToStr(len); } //--------------------------------------------------------------------------- void __fastcall TForm1::Btn_Hex2AscClick(TObject *Sender) { int i=0; char get_hex[4096] ,show_hex[128] ,get_char; char *p_memo1 ,*p_str; strcpy(get_hex ,Memo1->Text.c_str()); p_memo1 = get_hex; while(1) { p_str = strchr(p_memo1 ,' '); //抓取空白字元位址來判斷一個byte的輸入 if(p_str == NULL) { if(*p_memo1 > ' ') { get_char = Trans->HexToStr(p_memo1); show_hex[i++] = get_char; } break; } if(*p_memo1 > ' ') { get_char = Trans->HexToStr(p_memo1); show_hex[i++] = get_char; } p_memo1 = p_str+1; } Label1->Caption = IntToStr(i); show_hex[i++] = '\0'; Memo2->Text = show_hex; } //---------------------------------------------------------------------------
如此大致大完成了字元互轉的功能,請大家不吝指教,參考參考囉!
全站熱搜
留言列表