我一直在网上搜索这个类似的问题,但没有找到任何好的解决方案。我在ubuntu,我在串口上接收串行十六进制数据。我已使用零调制解调器电缆将我的系统连接到Windows系统,并且Windows系统正在运行docklight软件,该软件正在发送如下的十六进制数据:
2E FF AA 4F CC 0D
现在通过保存数据,我并不是说我想在终端上打印数据。我只想将这些数据保存在缓冲区中,以便我稍后处理它。
阅读我正在做的数据
res = read (fd, buf, sizeof buf)
//where buf is
unsigned char buf[255];
在阅读之后,buf包含一些随机字符。从互联网上的一些链接,我有办法将其转换为十六进制:
unsinged char hexData[255];
for (int i = 0; i < res; i++)
{
sprintf((char*)hexData+i*2, "%02X", buf[i]);
}
现在这个hexData包含2EFFAA4FCC0D
,这对我来说是好的。 (我不知道这是否是正确的做法)。现在假设我想将E
从hexData转换为十进制。但此时,E
将被视为字符而不是十六进制,所以我可能会得到69而不是14。
如何在变量中保存十六进制数据。我应该将它保存为chars或int数组。感谢。
答案 0 :(得分:1)
您已在buf
但是如果您仍然需要将十六进制转换为十进制,则可以使用sscanf
sscanf(&hexBuf[i],"%02X",&intVar);// intVar is integer variable
它会将hexBuf[i]
和hexBuf[i+1]
形成的十六进制字节转换为intVar
中的二进制,当您使用intVar
打印%d
时,您将看到十进制值
您可以将intVar
存储为unsigned character
数组
答案 1 :(得分:1)
你可能想要考虑你想要达到的目标。
十六进制只是一种表示。您接收的字节可以显示为十六进制对,二进制八位字节或一系列(或多或少)可打印字符(如果您打印unsigned char
数组,则会看到的内容)。
如果您需要的只是存储这些字节的十六进制表示,请将它们转换为十六进制,但请记住,您需要一个比缓冲区大两倍的数组(因为单个字节将由两个字节表示)转换后的十六进制字符)。
通常,最好的办法是将它们保存为一个字节数组(char
s),即你的buf
数组,并且只在需要显示十六进制时转换它们表示。