`

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

    博客分类:
  • C++
阅读更多

      昨天一个偶然机会,看到一篇文章,是关于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 - 'A' + 10;
		return true;
	}
	else if (ch>='a' && ch <= 'f')
	{
		binVal = ch - 'a' + 10;
		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));
}
//////////////////////////////////////////////////////////////////////////

 

    打完收工。~_~

 

0
1
分享到:
评论

相关推荐

    十六进制转换工具V1.0

    在通讯报文解析中,数据通常是以十六进制的形式传输,因为十六进制可以更简洁地表示二进制数据。例如,一个字节由8位二进制组成,可以表示从00000000到11111111的256个不同值。在十六进制中,只需两个字符就可以表示...

    ASCII及十六进制转换工具

    在计算机科学中,十六进制常用于表示二进制数据,因为每个十六进制数字可以表示4位二进制数,这使得长串二进制数更易于阅读和理解。 ASCII与十六进制之间的转换是常见的编程和数据处理任务。例如,一个ASCII字符的...

    浮点数十六进制转换器.zip

    在电力行业中,数据通常以二进制、十六进制或特定的规约格式进行传输,其中104、103和MODBUS是最常见的通信协议。 104规约,全称IEC 60870-5-104,是国际电工委员会制定的一种电力自动化设备间的数据通信协议。它...

    十六进制时间转化器和IP转化器

    在IT领域,尤其是在数据处理和网络通信中,十六进制(Hexadecimal)和IP地址的转换是常见的操作。本文将详细讲解"十六进制时间转化器和IP转化器"的相关知识点,以及它在实际工作中的应用。 首先,我们来探讨十六...

    用于将Modbus通信中截取后四字节的十六进制数转换为单精度浮点数(源码)

    在Modbus通信协议中,数据通常以二进制格式传输,包括整数、浮点数等。本主题主要关注如何将截取自Modbus通信的最后四字节十六进制数转换为单精度浮点数。这个过程涉及到计算机科学中的数值表示,特别是 IEEE754 ...

    Netty进制转换乱码问题

    在本文中,我们将深入探讨Netty中的进制转换和字符编码,并提供解决方案。 首先,我们要明白Netty作为一个高性能的网络应用框架,它本身并不直接处理字符编码,而是通过ByteBuf对象来存储和传输字节流。ByteBuf是...

    易语言任意进制间的相互转换源码.7z

    2. **网络通信**:在网络通信协议中,数据通常以二进制或十六进制的形式传输,需要进行进制转换进行解析和构建报文。 3. **编码解码**:在编码和解码过程中,如ASCII码和Unicode的转换,涉及到不同进制的换算。 ...

    hex2ascii_Hex2Char_十六进制转字符串_

    每个十六进制数字代表4位二进制数,例如,十六进制的'F'(15)在二进制中是1111。 2. **二进制到ASCII**:接着,根据ASCII码表,每7位二进制数对应一个ASCII码值。如果十六进制数不够7位,前面会补零。然后,根据这...

    java网络编程,UDP,发送16进制报文。

    Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,适用于在网络上传输非文本数据。在Java中,我们可以使用`java.util.Base64`类进行Base64编码和解码。假设我们已经从数据库获取了Base64编码的图片,将其...

    netty服务器解析16进制数据

    每个16进制数字对应4位二进制数,因此16进制常用于表示二进制数据,尤其是在网络传输或内存中存储二进制数据时,因为它的可读性比纯二进制更好。 2. **Netty 中的数据处理** Netty 提供了 `ByteBuf` 类作为缓冲区...

    Delphi通过 UDP 协议十六进制数据传输源程序.rar

    在传输十六进制数据时,通常需要将原始数据转换为字符串形式,以便在网络中以字符的形式传输。 在Delphi中,我们可以使用TIdUDPClient和TIdUDPServer组件来实现UDP通信。TIdUDPClient负责发送数据,TIdUDPServer...

    ASCII码和16进制数互相转换

    例如,如果报文中包含十六进制串"41424344",这代表ASCII码序列'ABCD',可能对应软件版本"ABCDEF"的一部分。通过编写自定义的转换工具,可以方便地完成这种验证工作,而且在提供的"Project"压缩包文件中,很可能就...

    bin_hex.zip

    例如,二进制数1011转换成十六进制就是B,因为1011在二进制中等于十进制的11,而11在十六进制中用B表示。 二、"Bin_Hex.exe" 工具的使用 1. 功能介绍:"Bin_Hex.exe" 是一个便捷的命令行工具,它的主要功能是将二...

    binFileTool.7z

    在计算机中,数据通常以二进制形式存在,但在表示和传输时,十六进制由于其简洁性和可读性而被广泛采用。十六进制每两位对应一个八位的二进制数,因此,16进制到2进制的转换是一个简单的映射过程。 1. 十六进制到二...

    串口调试工具可以实现通过串口发送和接收二进制和文本数据,

    3. **数据格式转换**:串口调试工具通常内置了二进制与十六进制、ASCII码之间的转换功能,方便用户在不同格式间切换查看和分析数据。 4. **保存和回放**:用户可以将发送和接收的数据保存到文件中,以备后续分析或...

    报文处理工具

    在数据处理方面,该工具支持多种进制转换,如二进制、八进制、十进制和十六进制之间的相互转换。这对于理解和调试涉及不同计算系统的程序非常有帮助,因为这些系统可能以不同的进制表示数值。例如,你可以轻松地将从...

    文本及二进制通信命令

    例如,Linux的`hexdump`命令可以将二进制数据转化为可读的十六进制格式,`xxd`则提供了更灵活的二进制与文本转换功能。而在Windows系统中,可以借助`certutil`命令的 `-decode` 和 `-encode` 参数来实现类似功能。 ...

    extract-string.rar_二进制数据

    1. **字符串在二进制中的表示**:在计算机中,字符串是由字符组成的序列。每个字符通常用特定编码(如ASCII或Unicode的UTF-8)来表示。例如,在ASCII编码中,每个字符对应一个7位的二进制数,而在UTF-8编码中,字符...

    HC110110003 IP编址

    在IP网络中,二进制和十六进制是常用的编码方式。二进制、十进制和十六进制之间可以相互转换。 IP地址转换 IP地址可以从二进制转换到十进制或十六进制,从而方便地表示和操作IP地址。 IP路由 IP路由是网络层的...

Global site tag (gtag.js) - Google Analytics