我发现.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++中实现这个函数?
发布于 2011-12-30 09:31:32
有人能在这里提供更详细的解释吗?
MSDN documentation for 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;
}发布于 2011-12-30 09:31:31
Fixed告诉垃圾回收器不要移动托管类型,以便您可以使用标准指针访问该类型。
在C++中,如果你不使用C++/CLI (也就是不使用.NET),那么你可以只使用一个字节大小的指针(char),然后遍历你想要转换的任何字节。
只需意识到字符顺序...
发布于 2011-12-30 09:32:31
必须使用First fixed,因为我们希望将指针分配给托管变量:
语句阻止垃圾回收器重新定位可移动变量。fixed语句只允许在不安全的上下文中使用。Fixed也可用于创建固定大小的缓冲区。
fixed语句设置一个指向托管变量的指针,并在语句执行期间“锁定”该变量。如果没有修复,指向可移动托管变量的指针将用处不大,因为垃圾回收可能会不可预测地重新定位变量。 C#编译器只允许您在固定语句中为托管变量赋值指针。 Ref。
然后我们声明一个指向byte的指针,并赋值给byte数组的开头。
然后,我们将byte的指针转换为int的指针,取消对它的引用,并将其赋值给传入的int。
https://stackoverflow.com/questions/8675248
复制相似问题