如何连接char数组元素并将其强制转换为float

How to concatenate char array elements and cast/convert them to float?

本文关键字:转换 float 数组元素 何连接 连接 char      更新时间:2023-10-16

我正在使用Winsock,我想将一些值从Simulink发送到我自己的程序中,然后在我的数学方程中使用这些值。我的计算机是64位的,所以char是2字节,float是8字节。我想在我的缓冲区中获得3个元素,这样我就可以将我的缓冲区时声明为char buffer[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;

}

此代码未编译,因为它包含有关字符串的错误。

您的问题有些混乱。CCD_ 1是否占用1字节、64位系统,CCD_ 2占用4个字节。但是,您应该将浮点的大小简单地表示为sizeof(float)以避免不必要的假设。

您的Windows PC是一个小端系统,我假设Simulink将值以32位小端浮点形式传输到您的程序,因此无需担心端转换。(但是检查Simulink设置,以防我对32位或小端序有错误)。

我还假设这些值是传输的,这样你就可以指望一次收到3,你想怎么做就怎么做(尽管我不知道你为什么要把它们捆成3分)。

在这种情况下,现在声明为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]中。点击此处了解char0。

这足以解决你的问题。但我强烈建议您查看返回CCD_ 11的值并采取相应的行动。如果通话成功返回接收到的字节数为CCD_ 12;否则为CCD_ 13。

您需要返回值为3 * sizeof(float),此代码才能工作。更灵活的代码只需确保它是sizeof(float)的倍数,然后提取尽可能多的浮点值。在任何情况下,您都需要处理SOCKET_ERROR

至于您看到的与字符串相关的编译错误,它们都是由同一个错误引起的在您的呼叫strcpy(myString,buf[0])和每次呼叫strcat(myString,buf[n])中。这个strcpy的签名为:

char * strcpy ( char * destination, const char * source );

CCD_ 20为

char * strcat ( char * destination, const char * source );

在每种情况下,第二个参数都必须是float1,并且通过CCD_ 22。这就是编译器的错误消息告诉你的:

error C2664: 'strcpy' : cannot convert parameter 2 from 'char' to 'const char *'
error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'

使用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之后的新功能。As是通过初始值设定项列表对s进行的初始化。