Хранение 4x 0-16 чисел в коротком (или 2 числа в байте)

#c# #hex #pack

#c# #шестнадцатеричное #пакет

Вопрос:

Я упаковываю некоторые двоичные данные как короткие, но хочу иметь 4 кратных значения 0-F .. И хотел бы сделать это, не имея кучу обращений switch (), считывающих строку. разделение шестнадцатеричного

У кого-нибудь есть умное, элегантное решение для этого или я должен просто использовать его?

например; 1C4A = (1, 12, 4, 10)

Комментарии:

1. Пожалуйста, покажите, что вы уже пробовали.

2. Заголовок указывает 2 числа в байте. Тело указывает 4-кратные числа в кратце. Пожалуйста, исправьте один из них.

3. Если бы вам нужно было два байта, я бы сказал, перейти к ExplicitLayout структуре, но вы не можете сделать это на base16

Ответ №1:

Смещение внутрь и наружу

 var a = 1;
var b = 12;
var c = 4;
var d = 10;

// in
var packed = (short) ((a << 12) | (b << 8) | (c << 4) | d);

// out
a = (packed >> 12) amp; 0xf;
b = (packed >> 8) amp; 0xf;
c = (packed >> 4) amp; 0xf;
d = packed amp; 0xF;

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
 

Выходной сигнал

 1
12
4
10
 

Ответ №2:

Вы можете сдвинуть на 4 (или разделить и умножить на 16), чтобы переместить числа в другое место значений. Затем замаскируйте и сдвиньте свой упакованный номер, чтобы вернуть исходные номера.

Например, если вы хотите сохранить 1 и 2, вы могли бы сделать:

 int packed = (1 << 4)   2;
int v1 = (packed amp; 0xF0) >> 4;
int v2 = packed amp; 0x0F;

Console.WriteLine($"{v1}, {v2}");
>>> 1, 2