Làm cách nào bạn chuyển đổi bất kỳ cấu trúc nào thành mảng byte trên các bộ xử lý có ít trình độ?Chuyển đổi cấu trúc thành byte
Trả lời
Bạn có thể sử dụng một char*
để truy cập bất kỳ loại đối tượng trong C++, vì vậy:
struct S
{
int a;
int b;
// etc.
};
S my_s;
char* my_s_bytes = reinterpret_cast<char*>(&my_s);
// or, if you prefer static_cast:
char* my_s_bytes = static_cast<char*>(static_cast<void*>(&my_s));
(Có ít nhất some debate trên tính đúng đắn của reinterpret_cast
vs các static_cast
; trong thực tế nó không thực sự quan trọng - cả hai nên mang lại kết quả tương tự)
:-) quá nhiều cải tiến ngôn ngữ hiện nay trên C++. Trong khi trước đây, điều này sẽ đủ: 'char * b = (char *) &my_s;' Có lẽ nếu tôi học C++ một lần nữa, tôi sẽ đọc một cái gì đó về những cấu trúc đúc đầu tiên. –
@Michael: Kiểu chữ C đó giống với 'reinterpret_cast' trong trường hợp này, vì không có sự kết hợp của' static_cast' và 'const_cast' là hợp lệ. Việc sử dụng các phôi kiểu C++ đảm bảo bạn sẽ có được diễn viên mà bạn dự định; C-style cast về cơ bản chỉ cố gắng một chuỗi năm loại khác nhau của phôi cho đến khi nó tìm thấy một trong đó hoạt động. –
Câu trả lời đúng với cấu trúc bạn đã chỉ định. Tuy nhiên, ném một số quần short, big_integers, hoặc dữ liệu nhân vật trong đó và nó là khủng khiếp sai. –
I like to use a union.
typedef struct b {
unsigned int x;
unsigned int y;
} b_s;
typedef union a {
b_s my_struct;
char ary[sizeof(b_s)];
} a_u;
Tại sao không chỉ 'ary [sizeof (b)]'? –
@Rob Đủ công bằng ... đã thay đổi. – WhirlWind
Bạn đang cố gắng làm gì? Nếu bạn đang cố gắng tuần tự hóa cấu trúc để bạn có thể lưu nó vào một tệp hoặc chuyển nó vào một tin nhắn, bạn nên sử dụng một công cụ được thiết kế cho giống như boost::serialization.
Nếu bạn chỉ muốn một mảng byte bạn có thể reinterpret_cast<char*>
như những người khác đã đề cập, hoặc làm:
MyStruct s;
char [] buffer = new char[sizeof(s)];
memcpy(&buffer, &s, sizeof(s));
tôi sẽ ngang vào void*
.
struct gizmo
{
//w/e
};
//stuff
gizmo *G = new gizmo;
void* bytearray = (void*)G;
Cách cấu trúc của bạn được đóng gói không rõ ràng và phụ thuộc vào trình biên dịch, ABI và CPU. Bạn sẽ phải tìm hiểu điều đó từ hướng dẫn sử dụng của bạn & một số đọc lắp ráp.
Bạn không thể truy cập byte qua khoảng trống * – nos
@nos: mở rộng, vui lòng. –
Vì bạn không thể dereference một void *, bạn không thể truy cập bất cứ điều gì nó trỏ đến (có lẽ thanh sử dụng memcpy, trong trường hợp một void trung gian * là không cần thiết) foo [0]; là một lỗi biên dịch nếu foo là void *. Sử dụng một char chưa ký * để truy cập các byte riêng lẻ. – nos
Vấn đề với tất cả những câu trả lời này là bạn không thể thực sự chuyển đổi byte câm mà không biết gì về dữ liệu bạn đang trao đổi. Dữ liệu ký tự không không được đổi chỗ. Các số nguyên 64 bit cần một loại hoán đổi khác nhau tùy thuộc vào cách hai bộ vi xử lý được đề cập thực hiện chúng.
- 1. Chuyển đổi mảng cấu trúc thành IntPtr
- 2. Chuyển đổi cấu trúc Go thành JSON
- 3. Trong Go, làm cách nào tôi có thể chuyển đổi cấu trúc thành mảng byte?
- 4. C++ Cấu trúc thành viên cấu trúc không đổi
- 5. Chuyển đổi danh sách cây thành cấu trúc phân cấp
- 6. Chuyển đổi XSD thành cấu trúc cây bằng Java
- 7. Chuyển đổi mảng 2D thành mảng có cấu trúc
- 8. Chuyển đổi cấu trúc Động [] thành danh sách số
- 9. Chuyển đổi sbyte thành byte
- 10. chuyển đổi DataHandler thành byte []
- 11. Làm thế nào để chuyển đổi một cấu trúc lớn-endian thành một cấu trúc endian nhỏ?
- 12. So sánh mảng Byte thành cấu trúc C#
- 13. Đọc các byte thành một cấu trúc trong C#
- 14. Chuyển đổi Endianess trên cấu trúc trường bit
- 15. Chuyển đổi byte thành bit trong python
- 16. Chuyển đổi Byte Array thành bit Array?
- 17. Cách chuyển đổi mảng byte thành NSString
- 18. Mảng kép chuyển đổi thành mảng byte
- 19. Chuyển đổi 2 byte thành số nguyên
- 20. chuyển đổi byte thành chuỗi C#
- 21. chuyển đổi bitmap thành mảng byte
- 22. Chuyển đổi Byte Array thành Bitset
- 23. Chuyển đổi byte ASCII [] thành chuỗi
- 24. Chuyển đổi BitmapImage thành mảng Byte
- 25. Chuyển đổi 2 byte thành một số
- 26. Cách chuyển đổi NSString thành byte
- 27. Chuyển đổi chuỗi unicode thành chuỗi byte
- 28. Chuyển đổi mảng byte thành PNG/JPG
- 29. chuyển đổi mảng chuỗi thành mảng byte
- 30. Chuyển đổi java.io.StringWriter thành mảng byte []
mở rộng theo yêu cầu của bạn - và lưu ý rằng câu trả lời của bạn sẽ cực kỳ phụ thuộc vào kiến trúc bộ vi xử lý – KevinDTimm
Đơn vị địa chỉ cho người cuối kỳ nhỏ là gì? Bạn đang thực sự cố gắng làm gì? – WhirlWind