2011-12-30 42 views
6

Tôi đã phát hiện ra rằng việc thực hiện GetBytes hàm trong .NET Framework là một cái gì đó như:Giới thiệu về "getBytes" thực hiện trong BitConverter

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

Tôi không như vậy chắc chắn tôi hiểu đầy đủ các chi tiết của những hai dòng:

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

Ai đó có thể cung cấp giải thích chi tiết hơn ở đây? Và làm thế nào tôi nên thực hiện chức năng này trong tiêu chuẩn C + +?

Trả lời

4

một người nào đó có thể cung cấp một lời giải thích chi tiết hơn ở đây?

Các MSDN documentation for fixed đi kèm với nhiều ví dụ và giải thích - nếu đó là không đủ, sau đó bạn sẽ cần phải làm rõ phần nào cụ thể mà bạn không hiểu.


Và làm cách nào để triển khai chức năng này trong chuẩn 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ố định yêu cầu bộ thu gom rác không di chuyển loại được quản lý để bạn có thể truy cập loại đó bằng con trỏ chuẩn. Trong C++, nếu bạn không sử dụng C++/CLI (nghĩa là không sử dụng .NET) thì bạn có thể sử dụng một con trỏ có kích cỡ byte (char) và lặp qua các byte trong bất kỳ thứ gì bạn đang cố gắng chuyển đổi.

Chỉ cần lưu ý endian ...

0

Đầu tiên cố định phải được sử dụng bởi vì chúng tôi muốn gán một con trỏ đến một biến quản lý:

Tuyên bố cố định ngăn cản việc thu gom rác từ di dời một biến thể di chuyển . Tuyên bố cố định chỉ được phép trong ngữ cảnh không an toàn . Đã sửa lỗi cũng có thể được sử dụng để tạo bộ đệm kích thước cố định.

Câu lệnh cố định đặt con trỏ tới biến được quản lý và "ghim" biến đó trong quá trình thực hiện câu lệnh. Nếu không có cố định, con trỏ đến các biến được quản lý di động sẽ ít được sử dụng vì bộ sưu tập rác có thể di chuyển các biến không thể đoán trước. Trình biên dịch C# chỉ cho phép bạn gán con trỏ cho biến được quản lý trong câu lệnh cố định .Ref.

Sau đó, chúng tôi khai báo con trỏ thành byte và gán cho phần đầu của mảng byte.

Sau đó, chúng tôi đúc con trỏ đến byte đến một con trỏ đến int, dereference nó và gán nó vào int thông qua vào.

0

Chức năng tạo ra một mảng byte chứa dữ liệu nhị phân giống như đại diện của nền tảng lại số nguyên value.Trong C++, việc này có thể đạt được (đối với bất kỳ loại thực sự) như sau:

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ây giờ b là một mảng như nhiều byte như kích thước của các loại int (hoặc bất cứ loại mà bạn sử dụng). Trong C# bạn cần phải nói fixed để có được con trỏ thô, vì thường bạn không có con trỏ thô trong C# trên tài khoản của các đối tượng không có vị trí cố định trong bộ nhớ - bộ thu gom rác có thể di chuyển chúng bất kỳ lúc nào . fixed ngăn chặn điều này và sửa chữa các đối tượng tại chỗ để một con trỏ nguyên có thể có ý nghĩa.

0

Bạn có thể triển khai GetBytes() cho bất kỳ loại POD nào có mẫu chức năng đơn giản.

#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)); 
} 
Các vấn đề liên quan