如何将文本框中存在的每个十六进制值转换为数组?

时间:2015-10-23 18:32:39

标签: vb.net

在我的应用程序中,用户可能需要在运行时在文本框中添加十六进制数,并且我希望通过删除空格来获取数组中的每个十六进制值。

例如,文本框中的数据是" ff 00 ff 1a ff 00"。借助split,我可以将每个十六进制数组作为数组。但是,现在我正在尝试删除所有空格,因为一些用户可能会输入十六进制而不给出空格。例如,用户输入" ff 00 ff1a ff 00"。因此,在这种情况下,第三个数组包含" ff1a",这不是真的。我知道如何删除空格,但无法找出将每个十六进制数组合成数组的方法。

'Used to split the strings based on the spaces, which is not useful
 'Dim extraData As String() = Split(TextBox8.Text, " ")

'Used to remove the spaces
Dim myString = TextBox8.Text.Replace(" ", "")

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

Dim input As String = TextBox1.Text
Dim list As New List(Of String) 
input = input.Replace(" ", "")
For i As Integer = 0 To input.Length - 1 Step 2
    list.Add(input.Substring(i, 2))
Next
Dim array = list.ToArray()

注意 - 输入的长度(删除空格后)必须是偶数。否则,它可能会抛出异常。

答案 1 :(得分:0)

如果我将方法从C#转换为this answer中给出的VB.NET:

Public Function StringToByteArray(hex As [String]) As Byte()
    Dim NumberChars As Integer = hex.Length
    Dim bytes As Byte() = New Byte(NumberChars / 2 - 1) {}
    For i As Integer = 0 To NumberChars - 1 Step 2
        bytes(i / 2) = Convert.ToByte(hex.Substring(i, 2), 16)
    Next
    Return bytes
End Function

然后你可以这样称呼它:

StringToByteArray(YourInputString.Replace(" ", ""))

这将返回一个字节数组,并且还将验证输入,因为如果输入中使用了无效字符(如非十六进制字符),它将抛出异常。

答案 2 :(得分:0)

我知道你已经接受了答案,但是,我想建议另一种选择。我假设,根据您的问题的上下文和您提供的示例,您的意图是解析字节列表,其中每个字节由两位十六进制值表示。

如果您使用正则表达式来查找匹配项,它会更强大。例如,您可以轻松忽略所有空格字符(例如制表符,换行符),您可以轻松验证数据,以确保字符串中只有格式正确的字节(即00 - {{1 }})。例如,你可以这样做:

FF

但是,如果想要解析实际的字节值,可以使用Dim bytes As New List(Of String)() Dim m As Match = Regex.Match(TextBox1.Text, "^\s*((?<byte>[a-fA-F0-9]{2})\s*)*$") If m.Success Then Dim g As Group = m.Groups("byte") If g.Success Then For Each c As Capture In g.Captures bytes.Add(c.Value) Next End If Else MessageBox.Show("Input is not properly formatted") End If 来完成,如下所示:

Byte.Parse

这两个示例都使用相同的正则表达式模式来查找字符串中的所有十六进制字节。它使用的模式是:

Dim bytes As New List(Of Byte)()
Dim m As Match = Regex.Match(TextBox1.Text, "^\s*((?<byte>[a-fA-F0-9]{2})\s*)*$")
If m.Success Then
    Dim g As Group = m.Groups("byte")
    If g.Success Then
        For Each c As Capture In g.Captures
            bytes.Add(Byte.Parse(c.Value, NumberStyles.HexNumber))
        Next
    End If
Else
    MessageBox.Show("Input is not properly formatted")
End If

以下是正则表达式的含义:

  • ^\s*((?<byte>[a-fA-F0-9]{2})\s*)*$ - 匹配必须从字符串的开头开始(即字节前没有无效的文本)
  • $ - 在第一个字节之前可以有任意数量的空白字符
    • \s* - 任何空格字符
    • \s - 零次或多次
  • * - 任意数量的字节,每个字节由任意数量的空格字符分隔
    • ((?<byte>[a-fA-F0-9]{2})\s*)* - 开始小组,以便我们以后可以将kleene star应用于整个群组(这意味着整个群组可以重复多次)
    • ( - 开始另一个名为(?<byte>的内部组。它被赋予一个名称,以便我们可以轻松地在VB代码中引用该组捕获的值。
    • "byte" - 两位十六进制字节(即[a-fA-F0-9]{2} - 00
    • FF - [a-fA-F0-9]a之间或fA之间或F0之间的任何字符< / LI>
    • 9 - 必须有两个符合该规范的字符
    • {2} - 结束名为)的群组。请注意,此命名组仅捕获两个实际的十六进制数字。它不捕获字节之间的任何空白区域。
    • "byte" - 字节后可以有任意数量的空白字符
    • \s* - 结束外部组,包括一个字节和后面的所有空白
    • ) - 前面提到的kleene明星意味着外群可以重复任意次数
  • * - 匹配必须以字符串的结尾结束(即字节后不能出现无效文本)