【发布时间】:2021-02-22 18:20:35
【问题描述】:
我需要将一个 64 位浮点数添加到特定索引处的 unsigned char 数组中(例如,索引 1 到 8)。
例如unsigned char数组:
unsigned char msg[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
我想在索引1,2,3,4,5,6,7,8 处的无符号字符数组中添加一个浮点数,例如0.084,以十六进制(小端序)表示为1B2FDD240681B53F,并保留索引0 和@ 987654330@不变。
所以,我希望 unsigned char 数组 msg 包含以下内容:
msg = {0x00, 0x1B, 0x2F, 0xDD, 0x24, 0x06, 0x81, 0xB5, 0x3F, 0x00}
到目前为止,我可以使用以下代码获得具有示例浮点值 0.084 的十六进制表示形式的 std::string,但我不确定如何将字符串值添加回 unsigned 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++ 解决方案。
【问题讨论】:
-
@Adrian Mole:除了 Adrian Mole 的解决方案之外,您为什么还要考虑考虑其他问题?
-
@paulsm4 为什么 OP 甚至会考虑考虑将序列化为字节数组,除非他们正在执行文件存储或网络通信。在这些情况下,Adrian Mole 的解决方案存在不同字节序的系统之间不兼容的问题。不过,限制在一个系统内也没问题。
-
这是用于网络通信的 - 我原本以为我必须颠倒顺序,我在使用字符串之前已经这样做了,但我相信两个系统都是小端的,所以 memcpy 解决方案似乎工作正常.
-
@user3716193
the memcpy solution seems to work fine如果您只在一个或相同字节序的系统上进行测试,可能看起来如此。它在不同字节序的系统之间不起作用,这通常是网络通信中应该考虑的一种可能性。 -
对于一个独立的应用程序,担心“字节顺序”......是愚蠢的。然而,对于网络消息,它可能是ESSENTIAL。坦率地说,我没有注意到变量名是“msg”; OP也没有在他的帖子中明确表示。 “网络消息”肯定需要“更强大”的解决方案……
标签: c++ arrays c char stdstring