2009-08-17 25 views
9

Câu hỏi này về cơ bản là một nửa thứ hai để khác của tôi QuestionChuyển đổi một giá trị uint16 thành một mảng uint8 [2]

Làm thế nào tôi có thể chuyển đổi một giá trị uint16, vào một uint8 * mảng mà không có một vòng lặp và tránh các vấn đề về cuối.

Về cơ bản tôi muốn làm một cái gì đó như thế này:

UINT16 value = 0xAAFF; 
UINT8 array[2] = value; 

Kết quả cuối cùng của việc này là để lưu trữ giá trị vào một mảng uint8 trong khi tránh chuyển đổi endian.

UINT8 * mArray; 
memcpy(&mArray[someOffset],&array,2); 

Khi tôi chỉ đơn giản là làm memcpy với giá trị uint16, nó chuyển đổi để ít về cuối nhỏ mà di tích đầu ra. Tôi đang cố gắng tránh sử dụng các hàm chuyển đổi cuối cùng, nhưng nghĩ rằng tôi có thể không may mắn.

Trả lời

25

Làm thế nào về

UINT16 value = 0xAAFF; 
UINT8 array[2]; 
array[0]=value & 0xff; 
array[1]=(value >> 8); 

này sẽ phân phối cùng một kết quả không phụ thuộc vào endian.

Hoặc, nếu bạn muốn sử dụng một initializer mảng:

UINT8 array[2]={ value & 0xff, value >> 8 }; 

(Tuy nhiên, điều này chỉ có thể nếu value là một hằng số.)

0

Một dàn diễn viên tạm thời để uint16 * nên làm điều đó:

((UINT16*)array)[0] = value; 
+1

Điều này không hoạt động vì nó vẫn nhạy cảm với tính cuối cùng (về cơ bản, nó giống như 'memcpy' trong câu hỏi). –

7

Không cần cho biên soạn có điều kiện. Bạn có thể bit-shift để nhận byte cao hơn và thấp hơn của giá trị:

uint16_t value = 0xAAFF; 
uint8_t hi_lo[] = { (uint8_t)(value >> 8), (uint8_t)value }; // { 0xAA, 0xFF } 
uint8_t lo_hi[] = { (uint8_t)value, (uint8_t)(value >> 8) }; // { 0xFF, 0xAA } 

Các phôi là tùy chọn.

+2

thẻ câu hỏi là C++, sử dụng C++ phôi. –

4

Giả sử rằng bạn muốn có các bậc cao byte trên byte bậc thấp hơn trong mảng:

array[0] = value & 0xff; 
array[1] = (value >> 8) & 0xff; 
+2

Mặt nạ '0xff' là không cần thiết: chuyển đổi từ 16 đến 8 bit số nguyên sẽ giảm byte cao hơn (chuyển đổi chưa ký được xác định rõ!) – Christoph

+2

Đó là sự thật, nhưng tôi thường che dấu mọi thứ cho rõ ràng. Đôi khi, tôi thậm chí sẽ làm một chút thay đổi bằng 0 để các dòng tất cả phù hợp và nhìn tốt theo chiều dọc. Bất kỳ trình biên dịch tốt sẽ tối ưu hóa ra các báo cáo không cần thiết, và nó cũng có giá trị rõ ràng. – Jonathan

1
union TwoBytes 
{ 
    UINT16 u16; 
    UINT8 u8[2]; 
}; 

TwoBytes Converter; 
Converter.u16 = 65535; 
UINT8 *array = Converter.u8; 
+1

Điều này nhạy cảm với tính xác thực. – Jonathan

0

tôi sử dụng chủ đề này để dev elop một giải pháp trải rộng các mảng có nhiều kích thước:

UINT32 value = 0xAAFF1188; 
int size = 4; 
UINT8 array[size]; 

int i; 
for (i = 0; i < size; i++) 
{ 
    array[i] = (value >> (8 * i)) & 0xff; 
} 
Các vấn đề liên quan