c++ - 如何在特定索引处将64位 float 添加到无符号char数组(C++)

标签 c++ arrays c char stdstring

我需要在特定索引(例如,通过unsigned char索引1)的8数组中添加64位浮点数。
示例unsigned char数组:

unsigned char msg[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
我想添加一个像0.084这样的浮点数,例如,以十六进制(小尾数)表示为1B2FDD240681B53F到索引1,2,3,4,5,6,7,8处的无符号char数组,并使索引09保持不变。
因此,我希望无符号字符数组msg包含以下内容:
msg = {0x00, 0x1B, 0x2F, 0xDD, 0x24, 0x06, 0x81, 0xB5, 0x3F, 0x00}
到目前为止,我可以使用以下代码获得带有示例浮点值std::string的十六进制表示形式的0.084,但我不确定如何将字符串值添加回无符号char数组中:
#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));
这将解决所有必需的指针对齐问题。但是,它不会对您的字节序进行任何“解释”-但这应该不是问题,除非您随后要在不同平台之间传输该字节数组。

关于c++ - 如何在特定索引处将64位 float 添加到无符号char数组(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64775221/

相关文章:

c - “变量”可能在此函数中未初始化使用,有一个可行的解决方法但不明白为什么

c - 顺序服务器 : behavior on accept(2) call

c++ - 在 std::move'ing 时警告调用复制构造函数

Python 列表理解嵌套循环

c++ - 每帧调用 glGetUniformLocation()

python - 将元组列表转换为 numpy 数组导致单维

javascript - 在html中显示来自javascript数组的图像

c - 在 Windows 中使用 64 位的 Long/Int

c++ - 在没有指向任何文件名的情况下使用 ofstream 时 << 发生了什么?

c++ - 在需要 noexcept-specification 但未实例化的情况下的依赖名称查找示例