将字节数组转换为 C++ 中的十进制数

Converting a byte array to a decimal number in C++

本文关键字:C++ 十进制数 转换 字节 字节数 数组      更新时间:2023-10-16

我正在尝试使用 Java 将纬度和经度转换为字节数组,然后使用 C++ 将字节数组转换为双精度数组。到目前为止,这就是我正在做的事情:

我有一个{0x40,0x4a, 0x62, 0x65, 0x27, 0xa2, 0x05, 0x79}字节数组,它在 JAVA 中给出了 52.768712

我正在尝试使用以下命令在C++中做同样的事情:

unsigned char data[8] = { 0x40,0x4a, 0x62, 0x65, 0x27, 0xa2, 0x05, 0x79};
 double sample;
 double conversion;
 copy(data, data+ sizeof(double), reinterpret_cast<char*>(&sample));
 memcpy(&conversion, data, sizeof(double));
 cout <<fixed << sample << endl;
 cout <<fixed << conversion << endl;

但这输出

93624845218206212768416858147698568034806357864636725490778543828533000856049725637297881892477906693728822997596617150540736669122257619339758101303551253860040255473731364930515446918886205365571056786975140751691636070476504921373224351498841838203471739594278994672877568.000000

我在这里做错了什么?

Endianness。Java是大端的,而C++是依赖于平台的。

这在基于英特尔的Windows PC(小端序(上对我有用:

#include <iostream>
#include <cstring>
#include <algorithm>
int main()
{
    unsigned char data[8] = { 0x40,0x4a, 0x62, 0x65, 0x27, 0xa2, 0x05, 0x79};
     double sample;
     double conversion;
     std::reverse(std::begin(data), std::end(data)); // Reverse byte order here
     std::copy(data, data+ sizeof(double), reinterpret_cast<char*>(&sample));
     std::memcpy(&conversion, data, sizeof(double));
     std::cout << std::fixed << sample << std::endl;
     std::cout << std::fixed << conversion << std::endl;
}

输出:

52.768712
52.768712

请注意,这本质上是不可移植的,因为字节序、double大小和浮点表示不是由C++语言标准定义的。