初接触windows编程, 需要把数字转为16进制表示的字符串显示出来, 如0x123456789abc转为"123456789abc". 或000000123456789abc形式
想直接搜来用发现都是32位且无法满足我要不要显示0的需求.
32位数有库函数可以直接转换, c提供了itoa ltoa utoa等详见数字转换为字符串 (windows特有).
不过需要注意在高版本上要改为_utoa_s 参数形式不变
也可以使用wsprintf(跨平台).
利用wsprintf就可以把64位数分为两部分,分别转换. 再对字符串位置进行控制就可以输出有0的形式
当然也可以顺便转换其他位的数字.
如果在循环里使用了返回值形式一定要在使用完后delete掉字符串空间不然造成可能堆溢出, 所以推荐参数返回形式 自行管理空间
在有0的情况下 缓冲区大小应+1 作为结束标志
最后因为是宽字符 需要转char的移步
char与wchar的转换
PS: 我的写法是用第16位来判断显示多少进制, 然后改变wsprint里面的参数即可
vs2017 64位通过
//不显示数字前的0
#define TYPE_HEXALL_WITHOUT_ZERO 0XF
#define TYPE_HEXWORD_WITH_ZERO 0X4
//显示8位数字包括0
#define TYPE_HEXDWORD_WITH_ZERO 0X8
#define TYPDWORD_DECIMAL 0xA008
#define TYPE_DECIMALALL_WITHOUT_ZERO 0xA00F
//#define TYPQWORD_DECIMAL 0xA010
//显示16位数字包括0
#define TYPE_HEXQWORD_WITH_ZERO 0X10
#define LOQWORD(l) ((DWORD) ( ( (QWORD) (l) ) & 0xffffffff) )
#define HIQWORD(l) ((DWORD)((((QWORD)(l)) >> 32) & 0xffffffff))
QWORD GetDigits(QWORD qwSrc)
{
QWORD dwDigits = 0;
while (qwSrc)
{
dwDigits++;
qwSrc /= 0x10;
}
return dwDigits;
}
VOID Hex2Str(QWORD qwSrc, QWORD srcType, LPWSTR wszDest)
{
DWORD dwHigh = HIQWORD(qwSrc);
DWORD dwLow = LOQWORD(qwSrc);
//已无符号整型显示
TCHAR wszShowType[4]= TEXT("%lX");
QWORD qwDigits = GetDigitsHex(dwHigh);
LPCWSTR wszPad = TEXT("0000000000000000");
switch (srcType)
{
//十进制和16进制不带0的显示实际上是一样的, 无非在使用wsprinf的时候要改变显示参数而已
//所以改变参数但不break接着进入hex里面
case TYPE_DECIMALALL_WITHOUT_ZERO:
{
wcscpy_s(wszShowType, TEXT("%u"));
}
//16进制任意类型并不显示0位
case TYPE_HEXALL_WITHOUT_ZERO:
{
//将高位数字dwHigh已lX的形式写入到wszDest中
wsprintfW(wszDest, wszShowType, dwHigh);
//写入低位数字
wsprintfW((LPWSTR)((QWORD)wszDest + qwDigits * 2), wszShowType, dwLow);
return;
}
//根据进制要显示几个0
case TYPE_HEXDWORD_WITH_ZERO:
{
memcpy(wszDest, wszPad, srcType * 2);
qwDigits = GetDigitsHex(dwLow); //DWORD
if (!qwDigits)
qwDigits++; //为0的情况
wsprintfW((LPWSTR)((QWORD)wszDest + 2 * (srcType - qwDigits)), wszShowType, LOQWORD(qwSrc));
return;
}
case TYPE_HEXQWORD_WITH_ZERO:
{
memcpy(wszDest, wszPad, srcType * 2);
wsprintfW((LPWSTR)((QWORD)wszDest + qwDigits * 2 * (8 - qwDigits)), wszShowType, dwHigh);
qwDigits = GetDigitsHex(dwLow);
wsprintfW((LPWSTR)((QWORD)wszDest + 16 + 2 * (8 - qwDigits)), wszShowType, LOQWORD(qwSrc));
return;
}
default:
break;
}
}