求帮助ASCII和十六进制转化的问题

C++语言 码拜 9年前 (2016-04-18) 725次浏览
最近在做个串口通讯的协议,走的是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  呢?
解决方案

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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助ASCII和十六进制转化的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)