VB. NET Преобразовать строку в массив байтов без преобразования символов - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь разбить строку из 32 числовых символов на массив байтов длиной 16, и каждое значение должно оставаться числовым

from "70033023311330000000004195081460" to array {&H_70, &H_03, &H_30, &H_23, ..}

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

'it splits but per 1 character only instead of two
str.Select(Function(n) Convert.ToByte(n, 10)).ToArray

'I also tried looping but then the leading zero disappears and the output is a string converted to HEX which is also not what I want.
Function ConvertStringToHexBinary(str As String) As Byte()
        Dim arr(15) As Byte
        Dim k = 0
        For i As Integer = 0 To str.Length - 1
            arr(k) = str(i) & str(i + 1)
            k += 1
            i += 1
        Next
        Return arr
    End Function

У кого-нибудь есть предложения, что делать?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Использование G3nt_M3caj LINQ может быть ... э ... привлекательным для любителей LINQ, но это ужасно неэффективно. LINQ - это молоток; не все - гвоздь.

Эта примерно в 3 раза быстрее, чем версия LINQ:

Dim str As String = "70033023311330000000004195081460"
Dim byt(str.Length/2) as Byte
For i = 0 to str.Length - 1 Step 2
  byt(i/2) = Convert.ToByte(str.Substring(i, 2))
Next i

И эта, которая все делает с математикой и не делает ничего нового струнная обработка вообще чуть менее 3 раз быстрее, чем указанная выше (что делает ее примерно в 9 раз быстрее, чем версия LINQ):

Dim str As String = "70033023311330000000004195081460"
Dim byt(str.Length / 2) As Byte
For i = 0 To str.Length - 1
    If i Mod 2 = 0 Then
        byt(i / 2) = (Convert.ToByte(str(i)) - &H30) * &HA
    Else
        byt(i / 2) += Convert.ToByte(str(i)) - &H30
    End If
Next i

Из двух я предпочитаю длинную версию, потому что ее легче читать и работать из того, что происходит - еще одно преимущество цикловых подходов перед подходом LINQ

0 голосов
/ 06 августа 2020

Вам что-то подобное нужно?

 Dim str As String = "70033023311330000000004195081460"
 Dim mBytes() As Byte = str.
        Select(Function(x, n) New With {x, n}).
        GroupBy(Function(x) x.n \ 2, Function(x) x.x).
        Select(Function(y) Convert.ToByte(New String(y.ToArray()), 10)).ToArray
...