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));

 

posted on 2018-01-12 15:02  南枝  阅读(765)  评论(0编辑  收藏  举报