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