俺偷懒了
// byte2char.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" typedef unsigned char BYTE; BYTE data[]={ 0x12,0x34,0x56 }; int _tmain(int argc, _TCHAR* argv[]) { char tmp[64]={0}; for (int i=0;i<sizeof(data)/sizeof(BYTE);i++) { char s[12]; itoa(data[i],s,16); strcat(tmp,s); } printf("%s/n",tmp); system("pause"); return 0; }
准确的算法是
#include <iostream> using std::cout; using std::endl; typedef char BYTE; BCDconvert(res_arr, c2_arr, sizeof(c2_arr)); BCDconvert(res_arr, c2_arr, sizeof(c2_arr)); BCDconvert(res_arr, c3_arr, sizeof(c3_arr)); BYTE* BCDconvert(BYTE *cr, BYTE *cl, int cl_len) { BYTE *cl_end = cl + cl_len; BYTE *cr_begin = cr; if (cl_len == 0) return NULL; for (; cl<cl_end; ++cl) { *cr++ = 0x30 | ((*cl & 0xF0) >> 4); *cr++ = 0x30 | *cl & 0x0F; } // cr[-1] == 0x30 ? cr[-1] = 0 : cr[0] = 0; /**/ while (cr > cr_begin && *--cr == 0x30) NULL; if (cr != cr_begin) cr[1] = 0; else return NULL; /**/ return cr; } int main(int argc, char *argv[]) { BYTE c1_arr[] = {0x12, 0x34, 0x56}; BYTE c2_arr[] = {0x12, 0x34, 0x50}; BYTE c3_arr[] = {0x00, 0x00, 0x00}; BYTE res_arr[32]; if (BCDconvert(res_arr, c1_arr, sizeof(c1_arr)) != NULL) cout << res_arr << endl; if (BCDconvert(res_arr, c2_arr, sizeof(c2_arr)) != NULL) cout << res_arr << endl; if (BCDconvert(res_arr, c3_arr, sizeof(c3_arr)) != NULL) cout << res_arr << endl; return 0; } 如果是只删除最后一个0,将 cr[-1] == 0x30 ? cr[-1] = 0 : cr[0] = 0; 取消注释, 另注释: /**/ while (cr > cr_begin && *--cr == 0x30) NULL; if (cr != cr_begin) cr[1] = 0; else return NULL; /**/ 将第一个/**/修改为/** /即可注释掉! 使用时需先检测返回时,如果返回值不为NULL,即转换正确,如果返回NULL,表示传入的BYTE[]有误,或者全为0(此仅在使用while时才有可能出现).