传输数据的时候都要带上包头,包头有简单的又复杂的,简单的只要能指明数据的长度就够了。

这里我写了一个工具类,可以方便地将整型的数据长度转换为长度为 4 的字节数组。

另一方面,可以方便的将长度为 4 的字节数组转换为整型的数据长度。

还提供了2进制数据和16进制字符串相互转换的两个方法。

ConvertUtil.h

//
// ConvertUtil.h
// MinaCppClient
//
// Created by yang3wei on 7/22/13.
// Copyright (c) 2013 yang3wei. All rights reserved.
// #ifndef __MinaCppClient__ConvertUtil__
#define __MinaCppClient__ConvertUtil__ #include <string> /**
* htonl 表示 host to network long ,用于将主机 unsigned int 型数据转换成网络字节顺序;
* htons 表示 host to network short ,用于将主机 unsigned short 型数据转换成网络字节顺序;
* ntohl、ntohs 的功能分别与 htonl、htons 相反。
*/ /**
* byte 不是一种新类型,在 C++ 中 byte 被定义的是 unsigned char 类型;
* 但在 C# 里面 byte 被定义的是 unsigned int 类型
*/
typedef unsigned char byte; #pragma mark int2bytes() & bytes2int() /**
* int 转 byte
* 方法无返回的优点:做内存管理清爽整洁
* 如果返回值为 int,float,long,double 等简单类型的话,直接返回即可
* 总的来说,这真心是一种很优秀的方法设计模式
*/
void int2bytes(int in_iValue, byte* out_pArrBytes, int in_iSize = 4); // byte 转 int
int bytes2int(byte* in_pArrBytes, int in_iSize = 4); #pragma mark hexStr2bytes() & bytes2hexStr() // char 转 int
int hexChar2int(char c); // 十六进制字符串转字节数组
void hexStr2bytes(std::string in_oStrHex, byte* out_pArrBytes, int& out_iSize); /**
* 字节数组转十六进制字符串
* string str;
* bytes2hexStr(t_oArrCharBuf, tmp_iRecvLen, str);
* printf("%s\n", str.c_str());
*/
void bytes2hexStr(byte* in_pArrBytes, int in_iSize, std::string& out_oStrHex); #endif /* defined(__MinaCppClient__ConvertUtil__) */

ConvertUtil.cpp

//
// ConvertUtil.cpp
// MinaCppClient
//
// Created by yang3wei on 7/22/13.
// Copyright (c) 2013 yang3wei. All rights reserved.
// #include "ConvertUtil.h" #define HEX_ELEMENTS "0123456789ABCDEF" // 已测,稳定~
void int2bytes(int in_iValue, byte* out_pArrBytes, int in_iSize) {
memset(out_pArrBytes, 0, sizeof(byte) * in_iSize);
out_pArrBytes[0] = (byte) (0xff & in_iValue);
out_pArrBytes[1] = (byte) ((0xff00 & in_iValue) >> 8);
out_pArrBytes[2] = (byte) ((0xff0000 & in_iValue) >> 16);
out_pArrBytes[3] = (byte) ((0xff000000 & in_iValue) >> 24);
} // 已测,稳定~
int bytes2int(byte* in_pArrBytes, int in_iSize) {
int t_iRetVal = in_pArrBytes[0] & 0xFF;
t_iRetVal |= ((in_pArrBytes[1] << 8) & 0xFF00);
t_iRetVal |= ((in_pArrBytes[2] << 16) & 0xFF0000);
t_iRetVal |= ((in_pArrBytes[3] << 24) & 0xFF000000);
return t_iRetVal;
} // 已测,稳定~
int hexChar2int(char in_oChar) {
if (in_oChar >= '0' && in_oChar <= '9') {
return (in_oChar - '0');
}
if (in_oChar >= 'A' && in_oChar <= 'F') {
return (in_oChar - 'A' + 10);
}
if (in_oChar >= 'a' && in_oChar <= 'f') {
return (in_oChar - 'a' + 10);
}
return 0;
} void hexStr2bytes(std::string in_oStrHex, byte* out_pArrBytes, int& out_iSize) {
out_iSize = (int)in_oStrHex.length();
out_pArrBytes = new byte[out_iSize]; for (int i = 0; i < out_iSize; i += 2) {
out_pArrBytes[i/2] = (char)((hexChar2int(in_oStrHex.at(i)) << 4) | hexChar2int(in_oStrHex.at(i + 1)));
}
} // 已测,稳定~
void bytes2hexStr(byte* in_pArrBytes, int in_iSize, std::string& out_oStrHex) {
std::string strHexElements(HEX_ELEMENTS);
for (int i = 0; i < in_iSize; i ++) {
out_oStrHex.append(1, strHexElements.at(0x0f & (in_pArrBytes[i] >> 4)));
out_oStrHex.append(1, strHexElements.at(0x0f & in_pArrBytes[i]));
}
}

main.cpp

//
// main.cpp
// MinaCppClient
//
// Created by yang3wei on 7/22/13.
// Copyright (c) 2013 yang3wei. All rights reserved.
// #include "TestConvertUtil.h"
#include "ConvertUtil.h" using namespace std; int main(int argc, const char * argv[]) {
int iValue = 19880607; unsigned char bytes[4];
int2bytes(iValue, bytes); string str;
bytes2hexStr(bytes, 4, str);
printf("%d 的十六进制字符串表示为:%s\n", iValue, str.c_str()); return 0;
}

bsd socket 网络通讯必备工具类的更多相关文章

  1. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  2. [dotnet core]使用Peach简化Socket网络通讯协议开发

    Peach是基于DotNetty的Socket网络通讯帮助类库,可以帮助开发者简化使用DotNetty,关于DotNetty可参考我之前的这篇文章. Peach内置实现了一个基于文本协议的Comman ...

  3. Android OkHttp网络连接封装工具类

    package com.lidong.demo.utils; import android.os.Handler; import android.os.Looper; import com.googl ...

  4. Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  5. Socket网络通讯

    网络编程 使用C#进行网络编程时,通常都需要用到System.Net命名空间.System.Net.Sockets命名空间和System.Net.Mail命名空间: 1. System.Net命名空间 ...

  6. HttpUtils 用于进行网络请求的工具类

    原文:http://www.open-open.com/code/view/1437537162631 import java.io.BufferedReader; import java.io.By ...

  7. [转] C#.Net Socket网络通讯编程总结

    1.理解socket1).Socket接口是TCP/IP网络的应用程序接口(API).Socket接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP网络应用程序.Socket可以看成是网络通 ...

  8. Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)

    先交待一下业务应用背景:服务端:移动交费系统:基于C语言的Unix系统客户端:增值服务系统:基于Java的软件系统通迅协议:采用TCP/IP协议,使用TCP以异步方式接入数据传输:基于Socket流的 ...

  9. MFC socket网络通讯核心代码

    服务器: AfxSocketInit();//初始化,必须执行这个函数socket才能正常执行 server.Create(10086); server.Listen(10); while(1) { ...

随机推荐

  1. OpenGL 资源汇编

    本文收集和汇总了 OpenGL 的文档.教程和在线书籍,供学习和开发者參考. OPENGL开发教程:http://www.linuxgraphics.cn/opengl/index.html Open ...

  2. driver: Linux设备模型之input子系统具体解释

    本节从总体上解说了输入子系统的框架结构.有助于读者从总体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识可以找准方向,明确原理. 本节重点: 输入子系统的框架结构 各层相应内核中的 ...

  3. LoadRunner中对图表的分析说明

    LoadRunner中对图表的分析说明 (一)在Vusers(虚拟用户状态)中 1.Running Vusers(负载过程中的虚拟用户运行情况) 说明——系统形成负载的过程,随着时间的推移,虚拟用户数 ...

  4. iOS开发-自动布局之autoresizingMask使用详解(Storyboard&Code)

    前言:现在已经不像以前那样只有一个尺寸,现在最少的IPHONE开发需要最少需要适配三个尺寸.因此以前我们可以使用硬坐标去设定各个控件的位置,但是现在的话已经不可以了,我们需要去做适配,也许你说可以使用 ...

  5. MVC的优缺点

    MVC的优点 大部分用过程语言比如ASP.PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程.例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接 ...

  6. NodeJS淘宝 CNPM 镜像

    原文地址:http://npm.taobao.org/ 设置NPM镜像(前提已安装NodeJS): npm config set registry https://registry.npm.taoba ...

  7. 【C#系列】你应该知道的委托和事件

    [C#系列]你应该知道的委托和事件   本篇文章更适合具有一定开发经验,一定功底,且对底层代码有所研究的朋友!!! 本篇文章主要采用理论和代码实例相结合方式来论述委托和事件,涉及到一些边界技术,如软件 ...

  8. rac_安装软件时报版本号过高问题

    原创作品,出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  9. CentOS7下利用init.d启动脚本实现tomcat开机自启动

    在之前的博文中已经对CentOS7下通过tomcat进行WEB系统的发布进行了介绍,今天将利用init.d启动脚本,将服务脚本加入到开机启动服务队列,实现tomcat服务的开机启动. 1. 环境准备 ...

  10. 辛星跟您玩转vim第二节之用vim命令移动光标

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载.这里是csdn的下载地址:csdn下载.假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http:// ...