昨天一个偶然机会,看到一篇文章,是关于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)); } //////////////////////////////////////////////////////////////////////////
打完收工。~_~
相关推荐
在通讯报文解析中,数据通常是以十六进制的形式传输,因为十六进制可以更简洁地表示二进制数据。例如,一个字节由8位二进制组成,可以表示从00000000到11111111的256个不同值。在十六进制中,只需两个字符就可以表示...
在计算机科学中,十六进制常用于表示二进制数据,因为每个十六进制数字可以表示4位二进制数,这使得长串二进制数更易于阅读和理解。 ASCII与十六进制之间的转换是常见的编程和数据处理任务。例如,一个ASCII字符的...
在电力行业中,数据通常以二进制、十六进制或特定的规约格式进行传输,其中104、103和MODBUS是最常见的通信协议。 104规约,全称IEC 60870-5-104,是国际电工委员会制定的一种电力自动化设备间的数据通信协议。它...
在IT领域,尤其是在数据处理和网络通信中,十六进制(Hexadecimal)和IP地址的转换是常见的操作。本文将详细讲解"十六进制时间转化器和IP转化器"的相关知识点,以及它在实际工作中的应用。 首先,我们来探讨十六...
在Modbus通信协议中,数据通常以二进制格式传输,包括整数、浮点数等。本主题主要关注如何将截取自Modbus通信的最后四字节十六进制数转换为单精度浮点数。这个过程涉及到计算机科学中的数值表示,特别是 IEEE754 ...
在本文中,我们将深入探讨Netty中的进制转换和字符编码,并提供解决方案。 首先,我们要明白Netty作为一个高性能的网络应用框架,它本身并不直接处理字符编码,而是通过ByteBuf对象来存储和传输字节流。ByteBuf是...
2. **网络通信**:在网络通信协议中,数据通常以二进制或十六进制的形式传输,需要进行进制转换进行解析和构建报文。 3. **编码解码**:在编码和解码过程中,如ASCII码和Unicode的转换,涉及到不同进制的换算。 ...
每个十六进制数字代表4位二进制数,例如,十六进制的'F'(15)在二进制中是1111。 2. **二进制到ASCII**:接着,根据ASCII码表,每7位二进制数对应一个ASCII码值。如果十六进制数不够7位,前面会补零。然后,根据这...
Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,适用于在网络上传输非文本数据。在Java中,我们可以使用`java.util.Base64`类进行Base64编码和解码。假设我们已经从数据库获取了Base64编码的图片,将其...
每个16进制数字对应4位二进制数,因此16进制常用于表示二进制数据,尤其是在网络传输或内存中存储二进制数据时,因为它的可读性比纯二进制更好。 2. **Netty 中的数据处理** Netty 提供了 `ByteBuf` 类作为缓冲区...
在传输十六进制数据时,通常需要将原始数据转换为字符串形式,以便在网络中以字符的形式传输。 在Delphi中,我们可以使用TIdUDPClient和TIdUDPServer组件来实现UDP通信。TIdUDPClient负责发送数据,TIdUDPServer...
例如,如果报文中包含十六进制串"41424344",这代表ASCII码序列'ABCD',可能对应软件版本"ABCDEF"的一部分。通过编写自定义的转换工具,可以方便地完成这种验证工作,而且在提供的"Project"压缩包文件中,很可能就...
例如,二进制数1011转换成十六进制就是B,因为1011在二进制中等于十进制的11,而11在十六进制中用B表示。 二、"Bin_Hex.exe" 工具的使用 1. 功能介绍:"Bin_Hex.exe" 是一个便捷的命令行工具,它的主要功能是将二...
在计算机中,数据通常以二进制形式存在,但在表示和传输时,十六进制由于其简洁性和可读性而被广泛采用。十六进制每两位对应一个八位的二进制数,因此,16进制到2进制的转换是一个简单的映射过程。 1. 十六进制到二...
3. **数据格式转换**:串口调试工具通常内置了二进制与十六进制、ASCII码之间的转换功能,方便用户在不同格式间切换查看和分析数据。 4. **保存和回放**:用户可以将发送和接收的数据保存到文件中,以备后续分析或...
在数据处理方面,该工具支持多种进制转换,如二进制、八进制、十进制和十六进制之间的相互转换。这对于理解和调试涉及不同计算系统的程序非常有帮助,因为这些系统可能以不同的进制表示数值。例如,你可以轻松地将从...
例如,Linux的`hexdump`命令可以将二进制数据转化为可读的十六进制格式,`xxd`则提供了更灵活的二进制与文本转换功能。而在Windows系统中,可以借助`certutil`命令的 `-decode` 和 `-encode` 参数来实现类似功能。 ...
1. **字符串在二进制中的表示**:在计算机中,字符串是由字符组成的序列。每个字符通常用特定编码(如ASCII或Unicode的UTF-8)来表示。例如,在ASCII编码中,每个字符对应一个7位的二进制数,而在UTF-8编码中,字符...
在IP网络中,二进制和十六进制是常用的编码方式。二进制、十进制和十六进制之间可以相互转换。 IP地址转换 IP地址可以从二进制转换到十进制或十六进制,从而方便地表示和操作IP地址。 IP路由 IP路由是网络层的...