• string、 int、byte、十六进制的转换


    做上下位机通信的项目,关于发送数据格式的一些转换,记录一下。

    一、两个函数

    主要用到两个函数:

    1. strtol  

    将数字字符串按照指定格式转换成数字

    std::string strInformation = “12”;

    BYTE  data = (BYTE)strtol(strInformation.c_str(), 0, 10);  //把“12”当成十进制,转换为 12

    BYTE  data = (BYTE)strtol(strInformation.c_str(), 0, 16);  //把“12”当成十六进制,转换为 0x0C

    2.itoa,ltoa

    将一个数转换为字符串,itoa转换小数,ltoa转换大数

    long deciNumber = 1506511812;

    char charNumber[15];

    //charNumber: 59, cb, 8b, c4

    ltoa(deciNumber, charNumber, 16); //转换为小写16进制字符存在charNumber中
    string strNumber(charNumber); //小写的十六进制字符串

    3. LOBYTE、HIBYTE、LOWORD、HIWORD

    取高、低位字节

    4. char buf[255];

    vector<BYTE> vecBytes;

    传入char *的参数时,可以传buf,或者&vecBytes[0]

    5.将string转换成char[]

    char buf[255];

    string str = “12345”;

    strcpy(buf, str.c_str());

    6.结构体的初始化和赋值

    struct STATUS
    {
    char      order_code[50];
    char      kind[7]; //
    double  amount; 
    int         n; 

    COleDateTime t;

    STATUS()

    {
    memset(order_code,0,sizeof(order_code));  //char数组初始化
    memcpy(kind, "100301", sizeof(kind));   //char数组赋值
    amount=0.0;
    n =1;
    }

    };

    STATUS st1;

    STATUS st2;

    memcpy(&st1, &st2, sizeof(STATUS ));  结构体赋值

    二、例子

    //将字符串按照16进制进行转换

    //"59cb8bc4"  --->  59, cb, 8b, c4

    void ConvertStrNumberToHex( std::string strNumber, vector<BYTE>& vecHex )
    {

    if (strNumber.size()%2 == 1) //
    {
    strNumber.insert(strNumber.begin(), '0' );
    }

    for(std::size_t i=0; i < strNumber.size(); )
    {
    string sStr = strNumber.substr(i, 2);
    //将字符串按照十六进制转换为数值
    BYTE data = (BYTE)strtol(sStr.c_str(), 0, 16);
    vecHex.push_back(data);

    i += 2;

    }
    }
    //

    //将字符串按照十进制进行转换

    //"59008714"  --->  59, 0, 87, 14

    void ConvertStrNumberToDecimal( std::string strNumber, vector<BYTE>& vecBytes )
    {

    if (strNumber.size()%2 == 1) //
    {
    strNumber.insert(strNumber.begin(), '0' );
    }

    for(std::size_t i=0; i < strNumber.size(); )
    {
    string sStr = strNumber.substr(i, 2);
    //将字符串按照十进制转换为数值
    BYTE data = (BYTE)strtol(sStr.c_str(), 0, 10);
    vecBytes.push_back(data);

    i += 2;

    }
    }

    //普通字符串转换成对应的ASCII码

    //"收费38元"  --->  CA D5 B7 D1 33 38 D4 AA ;汉字占两个字节
    void ConvertSimpleStringToBytes(std::string sInfo, vector<BYTE>& infoBytes)
    {
    vecByte v(sInfo.begin(),sInfo.end());
    infoBytes = v;
    }

    //小端模式存储,低字节在前,高字节在后,即将上面的函数转换出的vector<BYTE>bytes 逆序

    void ConvertDecimalToReverseHex( long deciNumber, vector<BYTE>& vecReverseHex )

    {

    char charNumber[15];
    ltoa(deciNumber, charNumber, 16); //转换为小写16进制字符存在bufTimeStamp中
    string strNumber(charNumber); //小写的十六进制字符串

    ConvertStrNumberToHex(strNumber, vecReverseHex);
    //逆序,小端存储
    reverse(vecReverseHex.begin(),vecReverseHex.end());

    }

    若一个数字只有两个字节,可以这样进行小端存储:

    int nStartYear = 2017;

    vecbyteInformation.push_back(LOBYTE(nStartYear));
    vecbyteInformation.push_back(HIBYTE(nStartYear));

  • 相关阅读:
    hdoj_1556Color the ball
    wchar_t与char转换(总结)
    算法艺术——网络最大流
    poj_3268Silver Cow Party
    poj_2352Stars
    BellmanFord模板
    saas模式
    什么是管道
    什么是CMMI
    saas模式
  • 原文地址:https://www.cnblogs.com/nanzhi/p/8275840.html
Copyright © 2020-2023  润新知