俺偷懶了
<br />// byte2char.cpp : 定義控制台應用程式的進入點。<br />//</p><p>#include "stdafx.h"</p><p>typedef unsigned char BYTE;</p><p>BYTE data[]={<br /> 0x12,0x34,0x56<br />};</p><p>int _tmain(int argc, _TCHAR* argv[])<br />{<br /> char tmp[64]={0};</p><p> for (int i=0;i<sizeof(data)/sizeof(BYTE);i++)<br /> {<br /> char s[12];<br /> itoa(data[i],s,16);<br /> strcat(tmp,s);<br /> }</p><p> printf("%s/n",tmp);</p><p> system("pause");</p><p> return 0;<br />}</p><p>
準確的演算法是
#include <iostream> </p><p>using std::cout;<br />using std::endl; </p><p>typedef char BYTE;<br />BCDconvert(res_arr, c2_arr, sizeof(c2_arr));<br />BCDconvert(res_arr, c2_arr, sizeof(c2_arr));<br />BCDconvert(res_arr, c3_arr, sizeof(c3_arr)); </p><p>BYTE* BCDconvert(BYTE *cr, BYTE *cl, int cl_len) {<br />BYTE *cl_end = cl + cl_len;<br />BYTE *cr_begin = cr;<br />if (cl_len == 0) return NULL; </p><p>for (; cl<cl_end; ++cl) {<br />*cr++ = 0x30 | ((*cl & 0xF0) >> 4);<br />*cr++ = 0x30 | *cl & 0x0F;<br />} </p><p>// cr[-1] == 0x30 ? cr[-1] = 0 : cr[0] = 0; </p><p>/**/<br />while (cr > cr_begin && *--cr == 0x30) NULL;<br />if (cr != cr_begin)<br />cr[1] = 0;<br />else return NULL;<br />/**/ </p><p>return cr;<br />} </p><p>int main(int argc, char *argv[]) {<br />BYTE c1_arr[] = {0x12, 0x34, 0x56};<br />BYTE c2_arr[] = {0x12, 0x34, 0x50};<br />BYTE c3_arr[] = {0x00, 0x00, 0x00}; </p><p>BYTE res_arr[32]; </p><p>if (BCDconvert(res_arr, c1_arr, sizeof(c1_arr)) != NULL)<br />cout << res_arr << endl; </p><p>if (BCDconvert(res_arr, c2_arr, sizeof(c2_arr)) != NULL)<br />cout << res_arr << endl; </p><p>if (BCDconvert(res_arr, c3_arr, sizeof(c3_arr)) != NULL)<br />cout << res_arr << endl; </p><p>return 0;<br />} </p><p>如果是只刪除最後一個0,將<br />cr[-1] == 0x30 ? cr[-1] = 0 : cr[0] = 0;<br />取消注釋, </p><p>另注釋:<br />/**/<br />while (cr > cr_begin && *--cr == 0x30) NULL;<br />if (cr != cr_begin)<br />cr[1] = 0;<br />else return NULL;<br />/**/<br />將第一個/**/修改為/** /即可注釋掉! </p><p>使用時需先檢測返回時,如果傳回值不為NULL,即轉換正確,如果返回NULL,表示傳入的BYTE[]有誤,或者全為0(此僅在使用while時才有可能出現).