十六进制到二进制无限长

十六进制到二进制无限长

还是想模仿大漠解析字库
发现大漠的字库十六进制文本根本太长根本无法转换 所以就构建了这函数;
字库还是没有完全理解什么意思!
它每次解析11行
如果小于等于22行还好
大于就不知道怎么解析了
看看P4的图片
FFFFFFFFFFF$十$4.3.102$22
4.3.102
4=左边突出4个
3=右边突出3个
102=有102个有效相数
22就是22行有效像数
在这里插入图片描述

/*大写到小写*/
char toUpper_(char* src)//大写到小写
{
	char* p = NULL;
	p = src;
	while (*p)//字符串不结束就循环
	{
		if (*p >= 'A' && *p <= 'Z') //判断小写字母
			*p += 32; //转大写
		p++; //指针后指,准备处理下一个字母
	}
	return *src; //返回修改后的字符串首地址
}

/*功能:十六进制到二进制无限长
参数1:十六进制文本
参数2:返回的二进制文本
*/
BOOL HexToBin(const char* str1, char** otr)
{
	if (isNull(str1)||isNull(otr))
	{
		return FALSE;
	}
	int len=strlen(str1);
	if (!len)
	{
		return FALSE;
	}
	char* str = new char[len+1];
	memset(str, 0, len + 1);
	sprintf(str, "%s", str1);
	toUpper_(str);
	PCHAR p = (PCHAR)str;
	for (size_t i = 0; i < len; i++)
	{
		if (!((p[i] >= '0' && p[i] <= '9') || (p[i] >= 'a' && p[i] <= 'f')))
		{
			delete[] str;
			return FALSE;
		}
	}
	char* t_ch2= new char[len * 4 + 1];
	*otr = t_ch2;
	memset(t_ch2, 0, len*4 + 1);
	for (size_t i = 0; i < len; i++)
	{
		int syew = 0;
		if ((p[i] >= '0' && p[i] <= '9'))
		{
			syew = p[i]-48;
		}
		else if ((p[i] >= 'a' && p[i] <= 'f'))
		{
			syew = p[i] - 87;
		}
		else
		{
			delete[] str;
			delete[] t_ch2;
			return FALSE;
		}

		switch (syew)
		{
		case 0x0:
		{
			char t_ch[] = "0000";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x1:
		{
			char t_ch[] = "0001";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x2:
		{
			char t_ch[] = "0010";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x3:
		{
			char t_ch[] = "0011";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x4:
		{
			char t_ch[] = "0100";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x5:
		{
			char t_ch[] = "0101";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x6:
		{
			char t_ch[] = "0110";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x7:
		{
			char t_ch[] = "0111";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x8:
		{
			char t_ch[] = "1000";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0x9:
		{
			char t_ch[] = "1001";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0xA:
		{
			char t_ch[] = "1010";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0xB:
		{
			char t_ch[] = "1011";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0xC:
		{
			char t_ch[] = "1100";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0xD:
		{
			char t_ch[] = "1101";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0xE:
		{
			char t_ch[] = "1110";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		case 0xF:
		{
			char t_ch[] = "1111";
			sprintf(t_ch2 + strlen(t_ch2), "%s", t_ch);
			break;
		}
		break;
		}
	}

	delete[] str;
	return TRUE;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C+V代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值