■ 问题提出
MFC自带函数_ultot(int ivalue, TCHAR* szBuf, int radix);可以将整数转换为16进制。不过使用这个函数有个问题就是如果16进制的高位为零的时候,就自动忽略。
比如
WORD wL = 0x3;
TCHAR szStandard[5];
_itot(wL,szStandard, 2);
szStandard的结果是“11”,跟我想要的“0011”有点差距。
查来查去的又浪费时间,还是自己写转换函数吧。嘿嘿
■ 简单要求(式样):
输入:整数Byte,有效位为低4位。
输出:TCHAR* 指向的数组。要求输出的值为“xxxx”格式。注意格式不是“xxxx xxxx”。因为我需要的Byte每次只是转换低4Bit。
■ 函数实现代码:
void _byte_to_bitstr(BYTE cValue, LPTSTR lpszBuf)
{
if ( lpszBuf == NULL )
return ;
int x = 0;
int radix = 2;
BYTE cTmpValue = cValue & 0x0F; // Only calc the low 4 Bit
while(cTmpValue)
{
cTmpValue /= radix;
if (cTmpValue)
x++;
}
for(int i = 0; i < 4; i++) // result must be 0000 ~ 1111 !!
{
lpszBuf[i] = L'0';
}
lpszBuf[4] = L'\0';
int iIndex = 3;
while( x >= 0 )
{
const int v = cValue % radix;
if (v > 10)
lpszBuf[iIndex] = 'a' + v - 10;
else
lpszBuf[iIndex] = '0' + v;
iIndex--;
cValue /= radix;
x--;
}
}
■ 测试:
TCHAR szBuf[5];
BYTE cValue = 0x3;
_byte_to_bitstr (cValue, szBuf);
■ 应用
给定一个WORD wValue = 0xcc33;可以得到字符串。
“1100 1100 0011 0011”
WORD wValue = 0xcc33;
CString strValue;
BYTE cValue;
TCHAR szBitArray3[5];
TCHAR szBitArray2 [5];
TCHAR szBitArray1 [5];
TCHAR szBitArray0 [5];
cValue = HIBYTE(wValue);
_byte_to_bitstr ((cValue >> 4) & 0x0F, szBitArray3);
_byte_to_bitstr ((cValue & 0x0F ), szBitArray2);
cValue = LOBYTE(wValue);
_byte_to_bitstr ((cValue >> 4) & 0x0F, szBitArray1);
_byte_to_bitstr (cValue & 0x0F , szBitArray0);
strValue.Format(_T("%s %s %s %s"), szBinary3, szBinary2, szBinary1, szBinary0);