Я хочу преобразовать интервал в байт [2] массив с помощью BCD.
Рассматриваемый интервал прибудет из DateTime, представляющего год, и должен быть преобразован в два байта.
Там кто-либо предварительно сделан функцией, которая делает это, или можно ли дать мне простой способ сделать это?
пример:
int year = 2010
произвел бы:
byte[2]{0x20, 0x10};
static byte[] Year2Bcd(int year) {
if (year < 0 || year > 9999) throw new ArgumentException();
int bcd = 0;
for (int digit = 0; digit < 4; ++digit) {
int nibble = year % 10;
bcd |= nibble << (digit * 4);
year /= 10;
}
return new byte[] { (byte)((bcd >> 8) & 0xff), (byte)(bcd & 0xff) };
}
Учтите, что вы запросили результат с прямым порядком байтов, это немного необычно.
Вот немного более чистая версия, чем Jeffrey's
static byte[] IntToBCD(int input)
{
if (input > 9999 || input < 0)
throw new ArgumentOutOfRangeException("input");
int thousands = input / 1000;
int hundreds = (input -= thousands * 1000) / 100;
int tens = (input -= hundreds * 100) / 10;
int ones = (input -= tens * 10);
byte[] bcd = new byte[] {
(byte)(thousands << 4 | hundreds),
(byte)(tens << 4 | ones)
};
return bcd;
}
Вот ужасная версия для перебора. Я уверен, что есть способ получше, но он все равно должен сработать.
int digitOne = year / 1000;
int digitTwo = (year - digitOne * 1000) / 100;
int digitThree = (year - digitOne * 1000 - digitTwo * 100) / 10;
int digitFour = year - digitOne * 1000 - digitTwo * 100 - digitThree * 10;
byte[] bcdYear = new byte[] { digitOne << 4 | digitTwo, digitThree << 4 | digitFour };
Печально то, что быстрое преобразование двоичного кода в двоично-десятичный встроено в архитектуру микропроцессора x86, если бы вы могли до них добраться!