报文传输中的进制转换(十六进制、二进制)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 报文传输中的进制转换(十六进制、二进制)

报文传输中的进制转换(十六进制、二进制)

 2011/1/17 7:39:21  jacky_dai  http://jacky-dai.javaeye.com  我要评论(0)
  • 摘要:昨天一个偶然机会,看到一篇文章,是关于C++socketserver和client传输报文的。然后就联想到以前做的报文传输,就联想到把十六进制流转换为二进制制流进行传输,最大的好处就是减少网络传输的负载。例如,”1234ab“字符串一般存储占用6个byte,可是转换为0x120x340xab,这样就只需要3个byte,一样达到预期的效果,现在就不废话了,把写的测试代码贴出来,有兴趣的,一起看看。/*
  • 标签:

????? 昨天一个偶然机会,看到一篇文章,是关于C++ socket server和client传输报文的。
????? 然后就联想到以前做的报文传输,就联想到把十六进制流转换为二进制制流进行传输,最大的好处就是减少网络传输
的负载。

????? 例如,”1234ab“字符串一般存储占用6个byte,可是转换为 0x12 0x34 0xab,这样就只需要3个byte,一样达到
预期的效果,现在就不废话了,把写的测试代码贴出来,有兴趣的,一起看看。

?

?

/*! *********************************************************************/
/*! \brief  convert int to binary buffer

\param[in]  value
\param[out] str
\Example    11 => "1011"            
/*************************************************************************/
const char* IntToBin(unsigned int value, string& str)
{
	str.empty();
	string temp;
	byte  binval =0x00;

	do
	{
		if ( value == 1)
		{
			temp.append("1");
            binval |= 0x08;
			
			string::reverse_iterator itr = temp.rbegin();
			string::reverse_iterator end = temp.rend();
			for (; itr != end ;++itr)
			{
				str += *itr;
			}

			return str.c_str();
		}
		else if ( value %2 == 0)
		{
			value /= 2;
			temp.append("0");
			binval >>= 1;
		}
		else
		{
			value /= 2;
			temp.append("1");
			binval |= 0x08;
			binval >>= 1;
		}
	}
	while(true);
}

void IntToBinTest()
{
	string str;
    cout << IntToBin(11, str) << endl ;
	cout << IntToBin(8, str) << endl ;
	cout << IntToBin(1234567, str) << endl ;
}
//////////////////////////////////////////////////////////////////////////
?

?

/*! *********************************************************************/
/*! \brief  convert int to binary buffer

\param[in]  value
\Example    11 => "1011"              
/*************************************************************************/
void IntToBin2(unsigned long value)
{
	//byte ibyte =255;
	
	while(value)
	{
		if (value & 0x01)
		{
			cout<<1;
		}
		else
		{
			cout<<0;
		}

		value >>= 1;
	}

	cout<<endl;
}

void IntToBin2Test()
{
	IntToBin2(1234567);
}
//////////////////////////////////////////////////////////////////////////

?

?

/*! *********************************************************************/
/*! \brief  check the character is valid hex char('0'~'9', 'A'~'z', 'a'~'z')

\param[in]   ch
\param[out]  binVal
\Example    'a' => 0x0a              
/*************************************************************************/
bool isValidHexChar(char ch, byte& binVal)
{
	if (ch >= '0' && ch <= '9')
	{
		binVal = ch - 48;
		return true;
	}
	else if (ch>='A' && ch <= 'F')
	{
		binVal = ch - 55;
		return true;
	}
	else if (ch>='a' && ch <= 'f')
	{
		binVal = ch - 87;
		return true;
	}

	return false;
}

void isValidHexCharTest()
{
	for (int i = '0'; i <= 'z'; i++)
	{
		byte val = 0;
		isValidHexChar(i, val);
	}
}
//////////////////////////////////////////////////////////////////////////

?

/*! *********************************************************************/
/*! \brief  convert two hex characters to byte

\param[in]   ch_h
\param[in]   ch_l
\param[out]  binval
\Example    '1a' => 0x1a              
/*************************************************************************/
void HexBufConvertToByte (char ch_h, char ch_l, byte& binval)
{
	byte temp = 0x00;
	binval = 0x00;

	if (isValidHexChar(ch_h, temp))
	{
		if ( temp & 0x08 ) binval |= 0x80;
		if ( temp & 0x04 ) binval |= 0x40;
		if ( temp & 0x02 ) binval |= 0x20;	
		if ( temp & 0x01 ) binval |= 0x10;
	}

	if (isValidHexChar(ch_l, temp))
	{	
		if ( temp & 0x08 ) binval |= 0x08;
		if ( temp & 0x04 ) binval |= 0x04;
		if ( temp & 0x02 ) binval |= 0x02;
		if ( temp & 0x01 ) binval |= 0x01;
	}

}

void HexBufConvertToByteTest()
{
	byte binval = 0x00;

	for (int i = '0'; i <= 'z'; i++)
	{
		HexBufConvertToByte(i, i+1, binval);
	}
}
//////////////////////////////////////////////////////////////////////////


/*! *********************************************************************/
/*! \brief  check hex characters byte buffer

\param[in]   hexBuf
\param[in]   binBuffer
\param[in]   iBinbufLen
\Example    "01234567" => 0x01 0x23 0x45 0x67              
/*************************************************************************/
void HexBufConvertToBin(const char* hexBuf, BYTE* binBuffer, int iBinbufLen)
{
	int iHexsize = strlen(hexBuf);
	for ( int i = 0; i < (iHexsize/2); i++)
	{
		if ( i < iBinbufLen)
		{
			HexBufConvertToByte( hexBuf[i*2], hexBuf[i*2+1], *(binBuffer++) );
		}
	}
}

void HexBufConvertToBinTest()
{
   const char* pHexBuf ="0123456789ABCDEFabcdef"; 
   byte bBuffer[100] ={0};

   HexBufConvertToBin(pHexBuf, bBuffer, sizeof(bBuffer));
}
//////////////////////////////////////////////////////////////////////////

?

??? 打完收工。~_~

?

  • 相关文章
发表评论
用户名: 匿名