如何解析通过 TCP 收到的数字字符串
How to parse numeric strings recieved over TCP
我正在通过 TCP 从我的传感器接收数据,输出如下所示:
<-0.040000 , -0.005000 , 0,025000 , 0,990000 , -0,000500 , 0.033000 >
这是一个 6 倍的双倍值。我只需要前三个。 X、Y 和 Z 方向的力,以获得它们的合力。有人告诉我我正在恢复 'sensor streams string representation of double' 并且我应该使用 atof 函数,该函数采用表示浮点数的字符串和 returns 双精度数。
那么,问题来了。我正在使用以下代码从传感器接收数据
char recvbuf[DEFAULT_BUFFER_LENGTH];
int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);
double n;
n = atof (recvbuf);
输出总是错误的,要么我得到错误的数据,30000 而不是 0.1414,或者我将 0.15 读为 0。关于如何获取所有 3 个数据的任何提示?我使用 BUFFER=50,因为我不需要阅读更多内容,我什至不知道来自传感器的字符串总共有多长。
您需要将其分解成更小的步骤。例如:
- 从套接字接收任意大小的数据包。
- 在数据包缓冲区 (
recvbuf
) 中搜索数据起始标记 '<'
。
- 将以下所有字符从数据包缓冲区复制到解析缓冲区(您需要创建它。使其足够大以容纳 6 个数据点的最长可能数据表示)。
- 3A。如果找到数据结束标记
'>'
,请转到步骤 4。
- 3B。如果您 运行 没有数据,请接收下一个数据包并重复步骤 3。
- 将逗号处的解析缓冲区分成 N 个值字符串。
- 使用
atof
或 fscanf
. 将每个值字符串转换为数字
- 转到Step2,从最后一个数据结束后的字符开始。
您正在数据流中的任意点调用 atof
。那是行不通的。
要可靠地执行此操作需要几个步骤。
您从 recv
获得的数据可以是部分数据集,需要附加到前面和后面的 recv
调用的数据。这有时以管道方式完成,将字符从 recvbuf
读取到 parsebuf
。
您的数据看起来是用 (
和 )
框起来的,因此您的复制例程可以跳到第一个 (
,然后将数据复制到以下内容)
当复制例程到达 recvbuf
的末尾时,它应该再次调用 recv
来填充 recvbuf
并从开始处继续构建数据recvbuf
它在 parsebuf
中停止的地方
在每个 )
中,parsebuf
中的数据将始终是 <x> , <y> , <z> , ...
,因此您的 atof
调用有一些合理的处理。考虑使用 fscanf
每次转换后重置指向parsebuf
的指针。
我正在通过 TCP 从我的传感器接收数据,输出如下所示: <-0.040000 , -0.005000 , 0,025000 , 0,990000 , -0,000500 , 0.033000 >
这是一个 6 倍的双倍值。我只需要前三个。 X、Y 和 Z 方向的力,以获得它们的合力。有人告诉我我正在恢复 'sensor streams string representation of double' 并且我应该使用 atof 函数,该函数采用表示浮点数的字符串和 returns 双精度数。
那么,问题来了。我正在使用以下代码从传感器接收数据
char recvbuf[DEFAULT_BUFFER_LENGTH];
int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);
double n;
n = atof (recvbuf);
输出总是错误的,要么我得到错误的数据,30000 而不是 0.1414,或者我将 0.15 读为 0。关于如何获取所有 3 个数据的任何提示?我使用 BUFFER=50,因为我不需要阅读更多内容,我什至不知道来自传感器的字符串总共有多长。
您需要将其分解成更小的步骤。例如:
- 从套接字接收任意大小的数据包。
- 在数据包缓冲区 (
recvbuf
) 中搜索数据起始标记'<'
。 - 将以下所有字符从数据包缓冲区复制到解析缓冲区(您需要创建它。使其足够大以容纳 6 个数据点的最长可能数据表示)。
- 3A。如果找到数据结束标记
'>'
,请转到步骤 4。 - 3B。如果您 运行 没有数据,请接收下一个数据包并重复步骤 3。
- 3A。如果找到数据结束标记
- 将逗号处的解析缓冲区分成 N 个值字符串。
- 使用
atof
或fscanf
. 将每个值字符串转换为数字
- 转到Step2,从最后一个数据结束后的字符开始。
您正在数据流中的任意点调用 atof
。那是行不通的。
要可靠地执行此操作需要几个步骤。
您从
recv
获得的数据可以是部分数据集,需要附加到前面和后面的recv
调用的数据。这有时以管道方式完成,将字符从recvbuf
读取到parsebuf
。您的数据看起来是用
(
和)
框起来的,因此您的复制例程可以跳到第一个(
,然后将数据复制到以下内容)
当复制例程到达
recvbuf
的末尾时,它应该再次调用recv
来填充recvbuf
并从开始处继续构建数据recvbuf
它在parsebuf
中停止的地方
在每个
)
中,parsebuf
中的数据将始终是<x> , <y> , <z> , ...
,因此您的atof
调用有一些合理的处理。考虑使用fscanf
每次转换后重置指向
parsebuf
的指针。