2010-04-22 48 views
6

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

+2

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

+0

Đơ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

Trả lời

11

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ự)

+0

:-) 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. –

+3

@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. –

+0

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. –

5
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; 
+1

Tại sao không chỉ 'ary [sizeof (b)]'? –

+0

@Rob Đủ công bằng ... đã thay đổi. – WhirlWind

2
(char*)&someStruct 
+1

Chà ... 'char', không phải' byte'. – Blindy

+0

#define byte (unsigned char) –

2

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)); 
1

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.

+1

Bạn không thể truy cập byte qua khoảng trống * – nos

+0

@nos: mở rộng, vui lòng. –

+0

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

0

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.

Các vấn đề liên quan