如何连接char数组元素并将它们转换/转换为float?

时间:2013-07-25 08:54:13

标签: c++ casting concatenation winsock

我正在使用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;

}

此代码无法编译,因为它有关于字符串的错误。

2 个答案:

答案 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一样。