2010-09-03 3 views
1

У меня есть массив байтов, представленный шестнадцатеричными значениями, это длительность времени. Данные могут быть преобразованы в целочисленные значения и умножены на константу, чтобы получить тайминги. Декодирование данных будет сохранено в файл в виде последовательности шестнадцатеричных строк. Что было бы эффективным способом манипулирования шестнадцатеричными значениями?Эффективное манипулирование шестью


Я смотрел на проблемы производительности при работе с форматами данных, как я должен работать с более чем одного формата на разных этапах (расчетов, отображения данных и т.д.). В большинстве примеров показано преобразование из байта [] в шестнадцатеричную строку («1A 3C D4») и наоборот, но я искал альтернативу, которая заключается в преобразовании в Int16 и использовании char [] массива.

+0

Как массив байтов «представляет шестнадцатеричные значения»? Означает ли это, что каждый байт является символом ASCII? Или каждый байт является числом от 0 до 15? – Gabe

+0

Я читаю байтовые массивы из последовательного порта.В протоколе устройства используются 16-битные шестнадцатеричные значения для представления периодов времени (hex => dec * constant = period). Поскольку периоды времени составляют в основном 2-3 приблизительных значения, мне нужно нормализовать шестнадцатеричные значения до известных значений (0x002A => 0x0029, 0x002c => 0x0029, 0x0050 = 0x0053 и т. Д.). Затем я декодирую нормализованные шестнадцатеричные значения и сохраняю декодированную шестнадцатеричную строку кода в файл. Декодированный шестнадцатеричный код представляет собой просто представление для бит. – OIO

ответ

5

Вы не байтовый массив, представляющий шестнадцатеричные значения. У вас есть массив байтов, представляющий номера. База, в которой вы указываете число, имеет значение , когда вы ее представляете.

Иными словами, если вы считаете, что ваш массив байтов представляет собой десятичные целые числа, как вы думаете, это будет иначе? Является ли мой рост другим, если я представляю его в футах и ​​дюймах вместо метров?

Теперь, если вы пытаетесь представить 16-разрядные номера, я бы предположил, что использование байтового массива - плохая идея. Вместо этого используйте ushort[] или short[], так как эти : 16-битные значения. Если у вас возникли проблемы с получением данных в таком массиве, пожалуйста, сообщите подробности ... аналогично, если у вас есть другие проблемы с манипуляциями. Просто имейте в виду, что до тех пор, пока вы не напишете данные как текст, на самом деле нет такой концепции, в какой базе она находится, насколько это касается компьютера.

(Обратите внимание, что это значение отличается от значений с плавающей запятой, где действительно будет быть разными между десятичным и двойным, например ... там база представления является частью формата данных. а не для целых чисел. В качестве альтернативы вы можете думать о том, что все целые числа являются просто бинарными, пока вы не решите их форматировать как текст ...)

+1

Взрыв как всегда, jon;) – Chris

0

MSDN От:

шестнадцатеричное ("Х") спецификатор формата преобразует число в строку шестнадцатеричных цифр. Случае формата спецификатор указывает, следует ли использование верхнего регистра или символы нижнего регистра для шестнадцатеричных цифр, которые больше, чем 9. Например, использовать «X» , чтобы произвести «ABCDEF», а «Х» продукции «ABCDEF ». Этот формат поддерживается только для интегральных типов.

Спецификатор точности указывает минимальное количество цифр, необходимое в полученной строке. При необходимости номер заполняется нулями до слева, чтобы получить количество цифр , заданное спецификатором точности.

byte x = 60; 
string hex = String.Format("0x{0:X4}", x); 
Console.WriteLine(hex); // prints "0x003C" 
+0

Преобразование в шестнадцатеричную строку не является проблемой, вопрос в том, являются ли строки единственным способом манипулирования шестнадцатеричными значениями (подумайте о научном калькуляторе). Я все еще решаю, как действовать, но вам нужно знать, можете ли вы обрабатывать шестнадцатеричные значения при обработке целых значений, а не строк. – OIO

+2

Шестнадцатеричный - это один из способов ** представить ** интегральные значения; десятичная (база 10), восьмеричная (база 8) и двоичная (база 2) - это другие. Целые числа не имеют неотъемлемого представления, пока вы не преобразуете их в удобочитаемые формы. Другими словами, 16-битные значения, с которыми вы работаете, ** не ** "hex" - это просто целые числа. –

Смежные вопросы