⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 str2hex.cpp

📁 我自己工程中用来与我的工控板测试udp通信的程序
💻 CPP
字号:
// str2hex.cpp

#include "stdafx.h"
#include "str2hex.h"

///////////////////////////////////////////////////////////////////////////////
// 算法

// 过滤16进制字符串中的非16进制字母
CString FilterHexStr(CString strHex)
{
	int i;
	char ch;
	CString str;

	strHex.MakeUpper();
	while( (i=strHex.Find(_T("0X")))>=0 )
		strHex.Delete(i, 2);

	str.Empty();
	for(i=0; i<strHex.GetLength(); i++) // 检查是否都是合法的16进制字符: 0~F
	{
		ch=(char)strHex.GetAt(i);
		if(ch>=48&&ch<=57 || ch>=65&&ch<=70 || ch>=97&&ch<=102)
		{
			str += ch;
		}
	}

	if(str.GetLength()%2) // 如果不足一个16进制值,最后一个字符去掉
		str.Delete(str.GetLength()-1);

	return str;
}

// 将合法的16进制字符串转换为整数数组
unsigned int HexStr2IntArray(CString strHex, unsigned char *ucIntArray)
{
	int i,j;
	CString str;
	unsigned char ch;
	unsigned char temp[2];

	if(!ucIntArray)
		return 0;

	str = strHex;

	// 将16进制字符串转为整型数组
	for(i=0; i<str.GetLength(); i+=2)
	{
		for(j=0; j<2; j++)
		{
			ch=(char)str.GetAt(i+j);		

			if(ch>=48&&ch<=57)
				temp[j]=ch-48;
			else if(ch>=65&&ch<=70)
				temp[j]=ch-65+10;
			else if(ch>=97&&ch<=102)
				temp[j]=ch-97+10;
		}
		ucIntArray[i/2]=temp[0]*16+temp[1];
	}

	return str.GetLength()/2;
}

// 将整数数组转换为合法的16进制字符串
CString IntArray2HexStr(unsigned char *ucIntArray, unsigned int count)
{
	CString strHex;
	CString str;	
	
	ASSERT(ucIntArray);
	ASSERT(count>0);

	str.Empty();
	strHex.Empty();

	for(unsigned int i=0; i<count; i++)
	{
		str.Format(_T("%02X"),ucIntArray[i]);
		strHex+=str;
	}
	
	return strHex;
}

// 过滤2进制字符串中的非2进制字母
CString FilterBinStr(CString strBin)
{
	int i;	
	char ch;
	CString str;

	str.Empty();
	for(i=0; i<strBin.GetLength(); i++) // 检查是否都是合法的16进制字符: 0~F
	{
		ch=(char)strBin.GetAt(i);
		if( ch==_T('0') || ch==_T('1') )
		{
			str += ch;
		}
	}

	if(str.GetLength()%8) // 如果不足一个2进制值(8位), 最后一个不足8位的二进制去掉
		str=str.Left(str.GetLength()/8*8);

	return str;
}

// 将合法的2进制字符串转换为整数数组
unsigned int BinStr2IntArray(CString strHex, unsigned char *ucIntArray)
{
	int i,j;
	unsigned char ch;
	unsigned char temp;

	if(!ucIntArray)
		return 0;

	// 将2进制字符串转为整型数组
	for(i=0; i<strHex.GetLength(); i+=8)
	{
		temp=0;
		for(j=0; j<8; j++)
		{
			ch=(char)strHex.GetAt(i+j);	

			if(ch==_T('1'))
				temp += 1<<(7-j);
		}
		ucIntArray[i/8]=temp;
	}

	return strHex.GetLength()/8;
}


// 整数转2进制数: 10d->0000_1010b
unsigned int Int2Bin(unsigned char hex[], unsigned int size_hex,
					 unsigned char bin[], unsigned int size_bin)
{
	unsigned int i;

	if(size_hex*8>size_bin)
		return 0;

	for(i=0; i<size_hex; i++)
	{
		bin[i*8+0] = (hex[i]>>7) & 0x01;
		bin[i*8+1] = (hex[i]>>6) & 0x01;
		bin[i*8+2] = (hex[i]>>5) & 0x01;
		bin[i*8+3] = (hex[i]>>4) & 0x01;
		bin[i*8+4] = (hex[i]>>3) & 0x01;
		bin[i*8+5] = (hex[i]>>2) & 0x01;
		bin[i*8+6] = (hex[i]>>1) & 0x01;
		bin[i*8+7] = (hex[i]>>0) & 0x01;
	}

	return 1;
}

// 2进制转为整数: 0000_1010b->10d
unsigned int Bin2Int(unsigned char bin[], unsigned int size_bin,
					 unsigned char hex[], unsigned int size_hex)
{
	unsigned int i;

	if(size_bin>size_hex*8)
		return 0;

	for(i=0; i<size_bin; i++)
	{
		bin[i] &= 0x01;
	}

	for(i=0; i<size_hex; i++)
	{
		hex[i] = bin[i*8+0]<<0 | bin[i*8+1]<<1 | bin[i*8+2]<<2 | bin[i*8+3]<<3 |
			bin[i*8+4]<<4 | bin[i*8+5]<<5 | bin[i*8+6]<<6 | bin[i*8+7]<<7;
	}

	return 1;
}


// end of str2hex.cpp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -