如何解决如何在特定索引处将64位浮点数添加到无符号char数组C ++
我需要在特定索引(例如索引unsigned char
至1
)的8
数组中添加64位浮点数。
示例unsigned char
数组:
unsigned char msg[10] = { 0x00,0x00,0x00};
例如,我想将一个像0.084
这样的浮点数添加到索引1B2FDD240681B53F
上的无符号char数组中,以十六进制(小端)表示为1,2,3,4,5,6,7,8
(用小尾数表示),然后离开索引0
和9
不变。
因此,我希望无符号字符数组msg
包含以下内容:
msg = {0x00,0x1B,0x2F,0xDD,0x24,0x06,0x81,0xB5,0x3F,0x00}
到目前为止,我可以使用以下代码获得带有示例浮点值std::string
的十六进制表示形式的0.084
,但是我不确定如何将字符串值加回到无符号字符中数组:
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main()
{
union udoub
{
double d;
unsigned long long u;
};
double dVal = 0.084;
udoub val;
val.d = dVal;
std::stringstream ss;
ss << std::setw(16) << std::setfill('0') << std::hex << val.u << std::endl;
std::string strValHexString = ss.str();
cout<< strValHexString << std::endl;
return 0;
}
输出:
3fb5810624dd2f1b
我尝试使用std::copy
,如下面的示例所示,将值从std::string
复制到unsigned char
,但似乎没有达到我想要的功能:
unsigned char ucTmp[2];
std::copy(strValHexString.substr(0,2).begin(),strValHexString.substr(0,2).end(),ucTmp);
正在寻找C或C ++解决方案。
解决方法
将组件字节格式化为十六进制字符串,然后再次读回这些字节,这是非常浪费时间和精力的。只需使用std::memcpy()
(在C ++中)或memcpy
(在C中):
std::memcpy(&msg[1],&dVal,sizeof(dVal));
这将解决所有必需的指针对齐问题。但是,它不会对您的字节序进行任何“解释”-但这应该不是问题,除非您随后要在不同平台之间传输该字节数组。
,您的示例由于未读取工会的成员而具有未定义的行为。一种明确定义的方法,可以转换为整数:
auto uVal = std::bit_cast<std::uint64_t>(dVal);
现在您已经拥有一个整数数据,您可以使用按位运算来提取特定位置的各个八位位组:
msg[1] = (uVal >> 0x0 ) & 0xff;
msg[2] = (uVal >> 0x8 ) & 0xff;
msg[3] = (uVal >> 0x10) & 0xff;
msg[4] = (uVal >> 0x18) & 0xff;
msg[5] = (uVal >> 0x20) & 0xff;
...
这可以压缩成一个循环。
请注意,无论CPU的字节顺序如何,其工作方式都相同。与直接std::memcpy
方法不同的是,数组中的结果顺序将始终是小端序,这会导致本机端序,而在所有系统上不一定是小端序。但是,如果浮点数和整数使用不同的字节序,则即使采用这种方法,顺序也不相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。