سؤال

هذا السؤال هو في الأساس في الشوط الثاني لآخر سؤال

كيف يمكنني تحويل قيمة UINT16، إلى صفيف UINT8 * بدون حلقة وتجنب مشاكل الإندان.

أساسا أريد أن أفعل شيئا مثل هذا:

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

النتيجة النهائية لهذا هي تخزين القيمة في صفيف UINT8 مع تجنب التحويل الإناادي.

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

عندما أقوم ببساطة بعمل MAMCPY بقيمة UINT16، فإنه يحول إلى هندسي يفسد الإخراج. أحاول تجنب استخدام وظائف التحويل الإناهة، لكن أعتقد أنني قد أكون بعيدا عن التوفيق.

هل كانت مفيدة؟

المحلول

ماذا عن

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

هذا ينبغي أن يقدم نفس النتيجة مستقلة عن الانتصاف.

أو، إذا كنت ترغب في استخدام المهيمة الصفيف:

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

(ومع ذلك، هذا ممكن فقط إذا value هو ثابت.)

نصائح أخرى

ليست هناك حاجة للترجمة المشروطة. يمكنك التحول قليلا للحصول على البايت العالي والسفلي للقيمة:

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 }

المصابيح اختيارية.

على افتراض أنك تريد أن يكون لديك البايت المرتفعة أعلى البايت من الدرجة الأولى في الصفيف:

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
union TwoBytes
{
    UINT16 u16;
    UINT8 u8[2];
};

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

يلقي مؤقتا إلى UINT16 * يجب أن تفعل ذلك:

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

لقد استخدمت هذا الموضوع لتطوير حل يمتد إلى صفائف من العديد من الأحجام:

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

int i;
for (i = 0; i < size; i++)
{
    array[i] = (value >> (8 * i)) & 0xff;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top