关于BitConverter中的“GetBytes”实现

6

我发现.net框架中GetBytes函数的实现类似于:

public unsafe static byte[] GetBytes(int value)
{
   byte[] bytes = new byte[4];
   fixed(byte* b = bytes)
     *((int*)b) = value;
   return bytes;
}

我不太确定我完全理解这两行的细节:

   fixed(byte* b = bytes)
     *((int*)b) = value;

有人可以在这里提供更详细的解释吗?我应该如何在标准C++中实现此函数?
6个回答

4

可否有更详细的解释呢?

MSDN对于fixed的文档中提供了许多示例和解释 -- 如果这不够,您需要澄清具体哪个部分您不理解。


我应该如何在标准C++中实现此函数?

#include <cstring>
#include <vector>

std::vector<unsigned char> GetBytes(int value)
{
    std::vector<unsigned char> bytes(sizeof(int));
    std::memcpy(&bytes[0], &value, sizeof(int));
    return bytes;
}

0

这里有一个C++头文件库,可能会有所帮助。

BitConverter

在C++中实现GetBytes函数的想法很简单:根据指定的布局计算值的每个字节。例如,假设我们需要获取大端无符号16位整数的字节,则可以将该值除以256以获取第一个字节,并将余数作为第二个字节。

对于浮点数,算法要复杂一些。我们需要获取数字的符号、指数和尾数,并将它们编码为字节。请参见https://en.wikipedia.org/wiki/Double-precision_floating-point_format


0

Fixed 告诉垃圾回收器不要移动托管类型,以便您可以使用标准指针访问该类型。

在 C++ 中,如果您没有使用 C++/CLI(即未使用 .NET),则可以使用字节大小的指针(char)并循环遍历您要转换的字节。

只需注意字节序...


0

首先,必须使用fixed语句,因为我们想要将指针分配给托管变量:

fixed 语句防止垃圾回收器重新定位可移动变量。fixed 语句仅允许在不安全的上下文中使用。Fixed 还可用于创建固定大小的缓冲区。

fixed 语句设置托管变量的指针并在语句执行期间“固定”该变量。没有 fixed,指向可移动托管变量的指针将没有什么用处,因为垃圾回收可能会无法预测地重新定位变量。在 fixed 语句中,C# 编译器只允许您为托管变量分配指针。 Ref

然后,我们声明一个 byte 类型的指针并将其分配给 byte 数组的开头。

接着,我们将 byte 类型的指针转换为 int 类型的指针,解除引用并将其分配给传递进来的 int 变量。


0

该函数创建一个字节数组,其中包含与整数value在您的平台上的二进制表示相同的数据。在C++中,可以通过以下方式(对于任何类型)实现:

int value; // or any type!
unsigned char b[sizeof(int)];
unsigned char const * const p = reinterpret_cast<unsigned char const *>(&value);
std::copy(p, p + sizeof(int), b);

现在b是一个字节数组,大小与类型int相同(或者您使用的任何其他类型)。

在C#中,您需要使用fixed关键字来获取原始指针,因为通常情况下,由于对象在内存中没有固定位置,所以在C#中没有原始指针 -- 垃圾回收器可以随时移动它们。 fixed可以防止这种情况发生,并将对象固定在原地,以便原始指针可以有意义。


0

你可以使用简单的函数模板为任何 POD 类型实现 GetBytes()。

#include <vector>

template <typename T>
std::vector<unsigned char> GetBytes(T value)
{
    return std::vector<unsigned char>(reinterpret_cast<unsigned char*>(&value),
                                      reinterpret_cast<unsigned char*>(&value) + sizeof(value));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接