Estoy tratando de dividir una cadena de 32 caracteres numéricos en una matriz de bytes de 16 longitudes y cada valor debe permanecer numérico

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

He intentado varias cosas, pero cada vez es la conversión la que está mal o no puedo encontrar la combinación adecuada de funciones para implementarla.

'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

¿Alguien tiene alguna sugerencia de qué hacer?

0
iThomas 6 ago. 2020 a las 13:05

2 respuestas

La mejor respuesta

¿Necesitas algo como esto?

 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
0
G3nt_M3caj 6 ago. 2020 a las 10:54

El uso de G3nt_M3caj de LINQ podría ser ... er ... atractivo para los amantes de LINQ, pero es terriblemente ineficiente. LINQ es un martillo; no todo es un clavo.

Éste es aproximadamente 3 veces más rápido que la versión 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

Y este, que lo hace todo con matemáticas y no hace ningún nuevo encadenamiento, es un poco menos de 3 veces más rápido que el anterior (lo que lo hace alrededor de 9 veces más rápido que la versión 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

De las dos, prefiero la versión fibrosa porque es más fácil de leer y entender lo que está pasando; otra ventaja que suelen tener los enfoques de bucles sobre un enfoque LINQ.

1
Caius Jard 6 ago. 2020 a las 17:21