BCD Hex String to Integer - PullRequest
       16

BCD Hex String to Integer

0 голосов
/ 30 декабря 2010

Мне удалось изменить решение, предоставленное Брэдом Кристи, чтобы получить ожидаемые результаты для часов, минут, секунд, месяцев, дней и лет, все из которых представлены в формате BCD:

static Int32 GetYearFromBCD(Int32 time) 
{ 
int length = time.ToString().Length -1;
List<Int32> YearList = new List<Int32>(); 
for (Int32 i = length; i >= 0; i --) 
{ 
Int32 place = i * 4; 
Int32 val = 0x01 << place; 

Int32 curVal = (Int32)(time / val); 
if (curVal > 9 && YearList.Count > 0) 
{ 
Int32 delta = (Int32)(curVal / 10); 
YearList[YearList.Count - 1] += delta; 
curVal -= delta * 10; 
} 
YearList.Add(curVal); 
time -= curVal << place; 
} 
Int32 Year = 0; 
for (Int32 y = 0; y < YearList.Count; y++) 
Year += YearList[y] * (Int32)Math.Pow(10,(length+1 - y)-1); 
return Year; 
} 

Я хотел бы предоставить обновление для этого вопроса.После того, как устройство работало в течение нескольких дней в течение Нового года, я смог полностью подтвердить, что кодовое решение, опубликованное Брэдом, делает именно то, что нам нужно.

Я смог подтвердить свои подозрения, что ожидаемое значение действительно было двоичным кодом, и я смог подтвердить, что ожидаемое значение работает только в шестнадцатеричном формате.Сотрудник был в состоянии независимо подтвердить время и дату, используя таблицу для стандарта, поэтому я чувствую себя комфортно, укладывая это в постель.

Я смог подтвердить, что по какой-либо причине десятичное значение данныхне работает, я могу только заключить, что данные передаются устройством в виде шестнадцатеричного значения, моя единственная забота - будут ли другие приложения работать аналогичным способом.

Я ценю помощь каждого в выяснении этого, некоторыеиз комментариев ведут меня по пути, который позволяет мне выяснить.

Ответы [ 3 ]

3 голосов
/ 30 декабря 2010

Ну, хотя цифры, кажется, не имеют смысла, это то, что я придумал (давая результаты , которые вы ожидаете (из приведенных примеров). Проведите это через отжиматель и посмотрите, будут ли получены все ожидаемые результаты:

static Int32 GetYearFromBCD(Int32 time)
{
    List<Int32> YearList = new List<Int32>();
    for (Int32 i = 3; i >= 0; i --)
    {
        Int32 place = i * 4;
        Int32 val = 0x01 << place;

        Int32 curVal = (Int32)(time / val);
        if (curVal > 9 && YearList.Count > 0)
        {
            Int32 delta = (Int32)(curVal / 10);
            YearList[YearList.Count - 1] += delta;
            curVal -= delta * 10;
        }
        YearList.Add(curVal);
        time -= curVal << place;
    }
    Int32 Year = 0;
    for (Int32 y = 0; y < 4; y++)
        Year += YearList[y] * (Int32)Math.Pow(10,(4 - y)-1);
    return Year;
}

Я на самом деле просто делаю снимок в темноте, потому что цифры, которые вы дали, не то, что я бы назвал типичным. Сказав это, вы должны заставить то, что вы получаете, работать, так что: shrug:.

1 голос
/ 30 декабря 2010

Если вы хотите преобразовать число в шестнадцатеричное представление, просто используйте ToString с "x" в качестве параметра:

2010.ToString("x")  output: "7da"

Однако я не совсем понимаю, чего вы хотите достичь, если вы скажете, что2010, вы ожидаете 200A.

1 голос
/ 30 декабря 2010

Вы действительно уверены, что ваш пример верен? Почему у вас есть шестнадцатеричное число, где первая часть с основанием 10, а вторая часть с основанием 16?

Обычный будет один из них:

  • 2010 => 0x07DA
    • полный гекс
  • 2010 => 0x140A
    • число разбито на полпути и каждая часть шестнадцатеричная
  • 2010 => 0x2010
    • bcd, закодированный как найдено в Википедии (где еще); -)

После некоторого поиска и размышлений вот моя первая идея:

  • Поместите все в BinaryReader .
  • Получить все значения по отдельности, вызвав BinaryReader.ReadByte () и привести его к типу int
  • Умножьте каждое значение сначала на 10, а затем разделите на 16
  • Поместите все эти отдельные значения в List<int>
  • используйте Math.Pow(value, 10 * (List.Count - indexOfValue)) для агрегирования всех этих значений
...