• bsd socket 网络通讯必备工具类


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

    这里我写了一个工具类,可以方便地将整型的数据长度转换为长度为 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
    ", 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
    ", iValue, str.c_str());
        
        return 0;
    }




  • 相关阅读:
    EasyDSS虚拟直播出现状态不同步及服务宕机的问题排查与解决
    C/C++中static,const,inline三种关键字的总结(参照网络)
    矩阵行列式的几何意义
    C# 中的Bitmap 和(c++)opencv之间的传递
    penCV isContinuous()连续存储的问题
    什么是奇排列什么是偶排列
    C++ 的一些免费库
    Makefile教程
    协方差矩阵的计算及意义 covariance(cov)
    如何安装.nupkg文件?
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212018.html
Copyright © 2020-2023  润新知