Преобразование HEX UTF8 во float
Существует ли более быстрый способ для перевода HEX UTF8 во float чем способ показанный ниже:
byte[] freqArray = { 0x31, 0x31, 0x34, 0x38, 0x2E, 0x35, 0x30, 0x30, 0x30 };
string freqs = System.Text.Encoding.UTF8.GetString(freqArray);
float freq = float.Parse(freqs, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(freq); //1148.5
Ответы (2 шт):
Автор решения: Exploding Kitten
→ Ссылка
Если вы используете .NET Core 2.1+ и особо не хотите изобретать другие алгоритмы, то можно воспользоваться Utf8Parser из System.Buffers.Text:
var result = Utf8Parser.TryParse(freqArray, out float freq, out _);
if (!result)
throw ...;
Console.WriteLine(freq);
Работает примерно в 2.2 раза быстрее (проверял на i5, Mac OS, .NET Core 3.1) и не создает лишних строк.
Автор решения: Deim
→ Ссылка
Наиболее быстрый вариант оказался следующим:
private static float HexSpanToFloat(Span<byte> span)
{
return (float)((span[0]&0xf)*1000+
(span[1]&0xf)*100+
(span[2]&0xf)*10+
(span[3]&0xf)+
(span[5]&0xf)*0.1+
(span[6]&0xf)*0.01+
(span[7]&0xf)*0.001+
(span[8]&0xf)*0.0001+
(span[9]&0xf)*0.00001+
(span[10]&0xf)*0.000001);
}
С подсказки nick_n_a