Эффективно преобразовать массив байтов в десятичныйC#

Место общения программистов C#
Ответить
Anonymous
 Эффективно преобразовать массив байтов в десятичный

Сообщение Anonymous »

Если у меня есть массив байтов и я хочу преобразовать непрерывный 16-байтовый блок этого массива, содержащий представление .net Decimal, в правильную структуру Decimal, какой способ является наиболее эффективным? сделать это?

Вот код, который появился в моем профилировщике как самый большой потребитель ресурсов ЦП в случае, который я оптимизирую.

Код: Выделить всё

public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
using (MemoryStream stream = new MemoryStream(src))
{
stream.Position = offset;
using (BinaryReader reader = new BinaryReader(stream))
return reader.ReadDecimal();
}
}
Чтобы избавиться от MemoryStream и BinaryReader, я подумал передать массив BitConverter.ToInt32(src, offset + x)s в конструктор Decimal(Int32[]) будет быстрее, чем решение, которое я представляю ниже, но версия ниже, как ни странно, в два раза быстрее.

Код: Выделить всё

const byte DecimalSignBit = 128;
public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
return new decimal(
BitConverter.ToInt32(src, offset),
BitConverter.ToInt32(src, offset + 4),
BitConverter.ToInt32(src, offset + 8),
src[offset + 15] == DecimalSignBit,
src[offset + 14]);
}
Это в 10 раз быстрее, чем комбинация MemoryStream/BinaryReader, и я протестировал ее с набором экстремальных значений, чтобы убедитесь, что это работает, но десятичное представление не так просто, как у других примитивных типов, поэтому я еще не уверен, что оно работает для 100% возможных десятичных значений.

Однако теоретически может существовать способ скопировать эти 16 смежных байтов в какое-то другое место в памяти и объявить их десятичными без каких-либо проверок. Кто-нибудь знает, как это сделать?

(Есть только одна проблема: хотя десятичные дроби представлены в виде 16 байтов, некоторые из возможных значений не являются допустимыми десятичными дробями, так что делаю непроверенный потенциально может что-то сломать...)

Или есть другой более быстрый способ?

Подробнее здесь: https://stackoverflow.com/questions/169 ... to-decimal
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»