C++ 将8字节转换为双字节
我在将8字节转换为双字节时遇到了一些问题。我有以下字节数组C++ 将8字节转换为双字节,c++,double,byte,C++,Double,Byte,我在将8字节转换为双字节时遇到了一些问题。我有以下字节数组 0x98 0xf9 0x38 0x4e 0x3a 0x9f 0x1c 0x43 我正努力做到以下几点 for (int i = 1; i < 8; i++) mult[i] = 256 * mult[i - 1]; double out= buf[7] * mult[7] + buf[6] * mult[6] + buf[5] * mult[5] + buf[4] * mult[4] +
0x98 0xf9 0x38 0x4e 0x3a 0x9f 0x1c 0x43
我正努力做到以下几点
for (int i = 1; i < 8; i++)
mult[i] = 256 * mult[i - 1];
double out= buf[7] * mult[7] + buf[6] * mult[6] + buf[5] * mult[5] + buf[4] * mult[4] + buf[3] * mult[3] + buf[2] * mult[2] + buf[1] * mult[1] + buf[0] * mult[0];
我从
mult[0]=1开始
请注意,您的代码可以写得更优雅:
double out = 0;
for (int i = 1; i < 8; i++) {
mult[i] = 256 * mult[i - 1];
out += buf[i - 1] * mult[i - 1];
}
double out=0;
对于(int i=1;i<8;i++){
mult[i]=256*mult[i-1];
out+=buf[i-1]*mult[i-1];
}
这样,您可以更清楚地看到错误在哪里 试试这个:
double a;
memcpy(&a, ptr, sizeof(double));
where ptr is the pointer to your byte array. If you want to avoid copying use a union, e.g.
union {
double d;
char bytes[sizeof(double)];
} u;
// Store your data in u.bytes
// Use floating point number from u.d
或
intmain()
{
无符号字符id[]={1,2,3,4,5,6,7,8};
长res=0;
对于(int b=0;b<8;++b)
res |=((long-long)id[b])你说0x98 0xf9 0x38 0x4e 0x3a 0x9f 0x1c 0x43
应该表示2014093029293670
如果前者是IEEE754 binary64格式中该整数的小端表示形式,则是正确的。因此,使用逐字节乘法(或等效的位移位)的方法将不起作用,因为这些是算术运算
相反,您需要将该表示形式别名为double
。要便于移植,请在小型endian机器上执行此操作,该机器上的double
是IEEE754 binary64:
static_assert( sizeof(double) == 8 );
double out;
memcpy(&out, buf, sizeof out);
如果您希望此代码在具有不同尾数的机器上工作,则在执行memcpy
之前,您需要重新排列buf
(这是假设表示总是以小尾数格式获得的,您没有说明).也许您想使用,我们是否应该假设字节旋转是为了确保在大端平台上保留此双精度原始字节的小端表示形式?是的,我同意。对此表示抱歉。我如何关闭它?您确实应该相信您从中复制的前一个问题和答案。例如,联合版本他在C++mult
中的未定义行为在这里是完全不必要的,他可以只为(int i=0;i<8;++i)out+=(uint64_t)buf[i]编写
int main()
{
unsigned char id[] = {1,2,3,4,5,6,7,8};
long long res = 0;
for (int b = 0; b < 8; ++b)
res |= ((long long)id[b]) << (b * 8);
unsigned char *ares = (unsigned char*)&res;
for (int i = 0; i < 8; ++i)
printf("%02x ", ares[i]);
return 0;
}
double x;
char buf[sizeof(double)]; // your data
#include <algorithm>
// ...
std::copy(buf, buf + sizeof(double), reinterpret_cast<char*>(&x));
In C:
#include <string.h>
/* ... */
memcpy(&x, buf, sizeof(double));
static_assert( sizeof(double) == 8 );
double out;
memcpy(&out, buf, sizeof out);