C++ 只在 char* 中存储 double 的特定字节
C++ Only Store Specific Bytes of a double in a char*
不幸的是,我正在使用旧版本的 c++(我相信是 98),所以我无法使用 c++11 的好东西。
除此之外,我想知道 - 是否可以只将 double 的特定字节存储在 char* 缓冲区中?例如,如果我有一个低值双精度数,因此只使用 3 个字节的数据,那么我可以只将 3 个字节的数据复制到 char* 缓冲区吗?
我知道可以将完整的双打复制到 char* 缓冲区中。目前我正在这样做,然后使用以下代码打印出 char* 缓冲区的二进制文件:
char* buffer = new char[8]; // A double is 8 bytes
memset(buffer, 0, sizeof(buffer)); // Fill the buffer with 0's
double value = 243;
memcpy(&buffer[0], &value, 8); // copy all 8 bytes (sizeof(value) is better here, I'm just typing '8' for readability)
for (int i = sizeof(value); i > 0; i --)
{
std::bitset<8> x(buffer[i-1]); // 8 bits per byte
std::cout << x << " ";
}
以上代码的输出符合预期:
01000000 01101110 01100000 00000000
00000000 00000000 00000000 00000000
如果我尝试只将前 3 个字节复制到 char* 缓冲区中,但是,看起来我根本没有复制任何内容。这是我尝试使用的代码:
char* buffer = new char[8]; // A double is 8 bytes
memset(buffer, 0, sizeof(buffer)); // Fill the buffer with 0's
double value = 243;
memcpy(&buffer[0], &value, 3); // Only copy over 3 bytes
for (int i = sizeof(value); i > 0; i --)
{
std::bitset<8> x(buffer[i-1]); // 8 bits per byte
std::cout << x << " ";
}
以上代码的输出是一个空缓冲区:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
有没有办法让我只将这个 double 的 3 个字节复制到我缺少的 char* 缓冲区?
谢谢!
您正在复制错误的字节,您的计算机是小端字节序,因此您要复制的 3 个字节实际上是双字节的最后三个字节。如果您将代码的复制行更改为此
memcpy(&buffer[0], (void*)(&value)+5, 3); // Copy the last three bytes
你得到了
的正确结果
00000000 00000000 00000000 00000000 00000000 01000000 01101110 01100000
不幸的是,我正在使用旧版本的 c++(我相信是 98),所以我无法使用 c++11 的好东西。
除此之外,我想知道 - 是否可以只将 double 的特定字节存储在 char* 缓冲区中?例如,如果我有一个低值双精度数,因此只使用 3 个字节的数据,那么我可以只将 3 个字节的数据复制到 char* 缓冲区吗?
我知道可以将完整的双打复制到 char* 缓冲区中。目前我正在这样做,然后使用以下代码打印出 char* 缓冲区的二进制文件:
char* buffer = new char[8]; // A double is 8 bytes
memset(buffer, 0, sizeof(buffer)); // Fill the buffer with 0's
double value = 243;
memcpy(&buffer[0], &value, 8); // copy all 8 bytes (sizeof(value) is better here, I'm just typing '8' for readability)
for (int i = sizeof(value); i > 0; i --)
{
std::bitset<8> x(buffer[i-1]); // 8 bits per byte
std::cout << x << " ";
}
以上代码的输出符合预期:
01000000 01101110 01100000 00000000 00000000 00000000 00000000 00000000
如果我尝试只将前 3 个字节复制到 char* 缓冲区中,但是,看起来我根本没有复制任何内容。这是我尝试使用的代码:
char* buffer = new char[8]; // A double is 8 bytes
memset(buffer, 0, sizeof(buffer)); // Fill the buffer with 0's
double value = 243;
memcpy(&buffer[0], &value, 3); // Only copy over 3 bytes
for (int i = sizeof(value); i > 0; i --)
{
std::bitset<8> x(buffer[i-1]); // 8 bits per byte
std::cout << x << " ";
}
以上代码的输出是一个空缓冲区:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
有没有办法让我只将这个 double 的 3 个字节复制到我缺少的 char* 缓冲区?
谢谢!
您正在复制错误的字节,您的计算机是小端字节序,因此您要复制的 3 个字节实际上是双字节的最后三个字节。如果您将代码的复制行更改为此
memcpy(&buffer[0], (void*)(&value)+5, 3); // Copy the last three bytes
你得到了
的正确结果00000000 00000000 00000000 00000000 00000000 01000000 01101110 01100000