无法将类型为'WhereSelectArrayIterator`2 [System.String,System.Byte]'的对象强制转换为'System.Byte []'。 Vb.net

时间:2017-08-30 09:58:51

标签: vb.net exception hex

我正在尝试在vb.net中创建一个程序,它的作用是当你打开一个文件时它将打开的文件转换为十六进制代码,但问题是当它保存并尝试将其转换回正常。结果为:(无法将类型为'WhereSelectArrayIterator`2 [System.String,System.Byte]'的对象转换为'System.Byte []'。)异常。

这是打开和保存代码

打开文件代码:FillWithHex(RichTextBox1,OpenFileDialog1.FileName)

    Async Sub FillWithHex(rtb As RichTextBox, name As String)
    For Each ctl In Controls
        ctl.Enabled = False
    Next ctl
    Dim buff(1000000) As Byte

    Using fs = New FileStream(name, FileMode.Open)
        Using br = New BinaryReader(fs)
            While True
                Dim text = String.Empty
                buff = br.ReadBytes(1000000)
                Await Task.Run(Sub() text = String.Join(" ", buff.
                            Select(Function(b) b.ToString("X2")))).
                            ConfigureAwait(True)
                rtb.AppendText(text)
                If buff.Length < 1000000 Then
                    Exit While
                End If
            End While

        End Using
    End Using
    For Each ctl In Controls
        ctl.Enabled = True
    Next ctl
    ToolStripLabel1.Text = "Status: Idle"
End Sub

这是保存代码

        Try
        Dim b As Byte() = RichTextBox1.Text.Split(" "c).Select(Function(n) Convert.ToByte(Convert.ToInt32(n, 16)))
        My.Computer.FileSystem.WriteAllBytes(SaveFileDialog1.FileName, b, False)
    Catch ex1 As Exception
        Try
            Dim b As Byte() = RichTextBox1.Text.Split(" "c).Select(Function(n) Convert.ToByte(Convert.ToInt32(n, 16)))
            My.Computer.FileSystem.WriteAllBytes(OpenFileDialog1.FileName, b, False)
        Catch ex As Exception
            MsgBox("Exception caught : " + vbNewLine + vbNewLine + ex.ToString, MsgBoxStyle.Critical, "Exception Error")
    End Try
    End Try

1 个答案:

答案 0 :(得分:0)

您在Enumerable类型的对象上调用的IEnumerable(Of T)类的扩展方法,就像Select方法一样,通常不会返回数组。它们通常返回一些实现IEnumerable(Of T)的类型。具体类型通常无关紧要。如果您需要一个数组,那么您需要在该对象上调用ToArrayToList同样会创建List(Of T)。这意味着你需要这个:

Dim b = RichTextBox1.Text.
                     Split(" "c).
                     Select(Function(n) Convert.ToByte(n, 16)).
                     ToArray()

请注意,我删除了显式类型声明,即As Byte(),并推断出类型。这样可以提供更简洁的代码,但如果您认为明确的类型有用,则不必这样做。请注意,我还删除了无用的Convert.ToInt32电话。