我正在使用Winsock,我想从Simulink向我自己的程序发送一些值,然后我将在我的数学方程式中使用这些值。我的计算机是64位,因此char是2个字节,float是8个字节。我希望在缓冲区中获得3个元素,以便将缓冲区声明为char缓冲区[12]。现在我需要合并buffer [0],buffer [1],buffer [2],buffer [3]和buffer [4],buffer [5],buffer [6],buffer [7]等...等等并希望拥有像12.23456这样的值。我怎么能这样做并将它转换(或转换)为浮动,以便在我的数学方程中使用这些值?
这是我到目前为止所做的:
#pragma once
#pragma comment(lib, "Ws2_32.lib")
#include <Windows.h>
#include <WinSock.h>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
WSAData wsaData;
WORD DllVersion = MAKEWORD(2,2);
int startup_RetVal = WSAStartup(DllVersion,&wsaData);
SOCKET sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
SOCKADDR_IN addr;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET;
addr.sin_port = htons(2222);
bind(sSocket, (SOCKADDR*)&addr, sizeof(addr));
char buf[12];
recvfrom(sSocket,buf,sizeof(buf),NULL,NULL,NULL);
char myString[4];
strcpy(myString,buf[0]);
strcat(myString,buf[1]);
strcat(myString,buf[2]);
strcat(myString,buf[3]);
//cast it to float
return 0;
}
此代码无法编译,因为它有关于字符串的错误。
答案 0 :(得分:1)
你的问题有些混乱。 char
占用1字节,64位系统与否,
并且float
占用4个字节。但是,您应该将浮点数的大小简单地表示为sizeof(float)
避免不必要的假设。
您的Windows PC是一个小端系统,我假设Simulink将值作为32位小端浮点数传输到您的程序,因此无需担心端序转换。 (但 检查Simulink设置,以防我对32位或小端的错误。
我还假设这些值正在被传输,以便您可以指望在时间接收3, 如你所愿(虽然我不知道为什么你需要它们捆绑在3s)。
在这种情况下,应声明现在声明为char buf[12];
的接收缓冲区
作为char buf[sizeof(float) * 3];
然后,删除:
char myString[4];
strcpy(myString,buf[0]);
strcat(myString,buf[1]);
strcat(myString,buf[2]);
strcat(myString,buf[3]);
//cast it to float
并将其替换为:
float af[3];
for (unsigned i = 0; i < 3; ++i) {
memcpy(af + i,buf + (i * sizeof(float)),sizeof(float));
}
这将从buf
复制3个连续浮动到3个浮点af[0]
,af[1]
,af[2]
。阅读memcpy
here。
这足以解决您的问题。但我强烈建议你查一下
返回值recvfrom
并采取相应行动。如果通话成功,它会
返回收到的int
字节数;否则SOCKET_ERROR
。
您需要返回值为3 * sizeof(float)
才能使此代码生效。更灵活的代码
只会确保它是sizeof(float)
的倍数,然后提取尽可能多的浮点数。无论如何,您需要处理SOCKET_ERROR
。
对于您看到的与字符串相关的编译错误,它们是由于同样的错误
在通话strcpy(myString,buf[0])
和每次通话中strcat(myString,buf[n])
。该
strcpy
的签名是:
char * strcpy ( char * destination, const char * source );
和strcat
的是:
char * strcat ( char * destination, const char * source );
在每种情况下,第二个参数必须是const char *
,并且在每种情况下都是char
通过error C2664: 'strcpy' : cannot convert parameter 2 from 'char' to 'const char *'
error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'
。这就是编译器的错误消息告诉你的:
{{1}}
答案 1 :(得分:0)
使用C ++ 11,您可以通过以下方式轻松完成:
#include <iostream>
using namespace std;
int main()
{
char buf[13] = "1.2378.40.00";
for(int n=0; n<3; ++n){
string s {buf[n*4],buf[n*4+1],buf[n*4+2],buf[n*4+3]};
double value = stof(s);
cout << value << endl;
}
}
stof()是自C ++ 11以来的新功能。与通过初始化列表初始化s一样。