最近在做个串口通讯的协议,走的是ASCII码
例如接收到的报文中数据段是4个字节33H 41H 38H 42H,代表的数据应该是ASCII的3A8B
本人的解析方式是
char ch[100]; //接收到的数据报文
char kj[100];
char kh[100];
memset(kj, 0, sizeof(kj));
memset(kh, 0, sizeof(kh));
//两个字节为一组解析
kj[0] = (char)((ch[0] << 4) | (ch[1] – 0x37)); //得到3a。这里为什么不是3A,而是3a?
kh[0] = (char)((ch[2] << 4) | (ch[3] – 0x37)); //得到
strcat(kj, kh);
string str =
接下去就各种方法都试了,就是不行。
问一下本人接下去可以怎么操作,能够达到将str这个字符串赋值为 3A8B 呢?
例如接收到的报文中数据段是4个字节33H 41H 38H 42H,代表的数据应该是ASCII的3A8B
本人的解析方式是
char ch[100]; //接收到的数据报文
char kj[100];
char kh[100];
memset(kj, 0, sizeof(kj));
memset(kh, 0, sizeof(kh));
//两个字节为一组解析
kj[0] = (char)((ch[0] << 4) | (ch[1] – 0x37)); //得到3a。这里为什么不是3A,而是3a?
kh[0] = (char)((ch[2] << 4) | (ch[3] – 0x37)); //得到
strcat(kj, kh);
string str =
接下去就各种方法都试了,就是不行。
问一下本人接下去可以怎么操作,能够达到将str这个字符串赋值为 3A8B 呢?
解决方案
30
#include <string> #include <vector> std::string translate(std::string str) { std::vector<std::string> vecNums; std::string strResult; std::string strTmp; char ch; int nPos; while ((nPos = str.find(" ")) != std::string::npos) { vecNums.push_back(str.substr(0, nPos)); str = str.substr(nPos + 1, str.length()); } vecNums.push_back(str); if (vecNums.size() & 0x01) return ""; for (int i = 0; i < vecNums.size(); i++) { strTmp = vecNums.at(i); if (strTmp.length() != 3 && strTmp.at(strTmp.length() - 1) != "H") return ""; ch = (strTmp.at(0) - "0") * 16; ch += (strTmp.at(1) - "0"); strResult += ch; } return strResult; } int main() { std::string strData; std::string strResult; strData = "33H 41H 38H 42H"; strResult = translate(strData); printf("%s\n", strResult.c_str()); return 0; }
10
#define ASCII_VALUE(value) ((“0” <= (value) && (value) <= “9”) ? (value) – “0” : (“a” <= (value) && (value) <= “z”) ? (value) – “a” + 10 : (“A” <= (value) && (value) <= “Z”) ? (value) – “A” + 10 : (assert(0), 0))
unsigned char ConvertByteFromASCII(char const *value)
{
return (ASCII_VALUE(value[0]) << 0x04) | ASCII_VALUE(value[1]);
}
unsigned short int ConvertUSHORTFromASCII(char const *value)
{
return (ConvertByteFromASCII(value) << 0x08) | ConvertByteFromASCII(value + 2);
}
int main()
{
char szValue[] = { 0x33, 0x41, 0x38, 0x42 };
TRACE(L”%04X”, ConvertUSHORTFromASCII(szValue));
}
unsigned char ConvertByteFromASCII(char const *value)
{
return (ASCII_VALUE(value[0]) << 0x04) | ASCII_VALUE(value[1]);
}
unsigned short int ConvertUSHORTFromASCII(char const *value)
{
return (ConvertByteFromASCII(value) << 0x08) | ConvertByteFromASCII(value + 2);
}
int main()
{
char szValue[] = { 0x33, 0x41, 0x38, 0x42 };
TRACE(L”%04X”, ConvertUSHORTFromASCII(szValue));
}