如何连接char数组元素并将其强制转换为float
How to concatenate char array elements and cast/convert them to float?
我正在使用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]
中。点击此处了解char
0。
这足以解决你的问题。但我强烈建议您查看返回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 );
在每种情况下,第二个参数都必须是float
1,并且通过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进行的初始化。
- 没有从阵列<float>到阵列<int>的可行转换
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 如何将 qml 的文本转换为 float 和 int
- 错误:无法将"float*"转换为"float"
- 缩小从double到float的转换
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- 如何有效地将一个大std::字符串的一部分转换为float
- 如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float
- C++优化从 int 到 float 的数组转换
- OpenCL 将 float16 转换为 float*
- 在 C++ 中从 'const float*' 到 'float*' 的转换无效
- 如何修复"无法在初始化时将'Tmp'转换为'float'
- 如何将 std::array<double, 100> 转换为 std::array<float, 100> ?(避免明显的样板实现)
- 如何将可变字符串[]转换为float
- 警告:从 'char *' 到 'float *' 的强制转换将所需的对齐从 1 增加到 4 [-Wcast-align]
- 有没有一种优雅的方法可以将矢量<复杂<float>>转换为矢量<short>?
- MBED RTOS将Float转换为字符串/字符阵列
- 不知道参数 1 从 sf::Vector2i 到 const sf::Vector2i& 的转换<float>
- 显式类型转换 float(intvar) 结果为 int