C++ 如何连接字符数组元素并将其强制转换为浮点?

C++ 如何连接字符数组元素并将其强制转换为浮点?,c++,casting,concatenation,winsock,C++,Casting,Concatenation,Winsock,我正在使用Winsock,我想从Simulink发送一些值到我自己的程序,然后我会在我的数学方程中使用这些值。我的计算机是64位的,所以一个字符是2字节,一个浮点是8字节。我想在我的缓冲区中获得3个元素,以便我将我的缓冲区声明为char buffer[12]。现在我需要合并缓冲区[0]、缓冲区[1]、缓冲区[2]、缓冲区[3]和缓冲区[4]、缓冲区[5]、缓冲区[6]、缓冲区[7]和。。。以此类推,并希望有一个像12.23456这样的值。我怎样才能做到这一点,并将其转换(或转换)为float,以

我正在使用Winsock,我想从Simulink发送一些值到我自己的程序,然后我会在我的数学方程中使用这些值。我的计算机是64位的,所以一个字符是2字节,一个浮点是8字节。我想在我的缓冲区中获得3个元素,以便我将我的缓冲区声明为char buffer[12]。现在我需要合并缓冲区[0]、缓冲区[1]、缓冲区[2]、缓冲区[3]和缓冲区[4]、缓冲区[5]、缓冲区[6]、缓冲区[7]和。。。以此类推,并希望有一个像12.23456这样的值。我怎样才能做到这一点,并将其转换(或转换)为float,以便在我的数学方程中使用该值

以下是我迄今为止所做的尝试:

#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;
#pragma一次
#pragma注释(lib,“Ws2_32.lib”)
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
WSAData WSAData;
单词DllVersion=MAKEWORD(2,2);
int startup_RetVal=WSAStartup(DllVersion和wsaData);
SOCKET sSocket=套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
地址中的SOCKADDR_;
addr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
addr.sin_family=AF_INET;
地址sin_port=htons(2222);
绑定(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]);
//让它漂浮起来
返回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;
    }
}
#包括
使用名称空间std;
int main()
{
char buf[13]=“1.2378.40.00”;

对于(int n=0;n您的问题有些混乱。字符是否占用1字节,64位系统, 而
float
占用4个字节。但是,您应该将float的大小简单地表示为
sizeof(float)
避免不必要的假设

您的Windows PC是一个little endian系统,我假设Simulink以32位little endian浮点形式将值传输到您的程序,因此不需要担心endian转换 检查Simulink设置,以防我在32位或little endian方面出错)

我还假设正在传输这些值,这样您就可以一次收到3个, 如您所愿(尽管我不知道您为什么要求将它们捆绑在3s中)

在这种情况下,您的接收缓冲区现在声明为
charbuf[12];
charbuf[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));
}
strcat
的值为:

char * strcpy ( char * destination, const char * source );
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 *'

语言标签是合适的。你可以确定你的语言标签不是世界上唯一的语言标签,也不是唯一可以使用winsock的语言标签。