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