2017-08-30 15 views
0

私はvb.netでプログラムを作ろうとしていますが、それはファイルを開いたときにファイルが16進数のコードに変わるということですが、問題はそれが保存されて変換しようとするときです正常に戻る。結果は次のようになります。( 'WhereSelectArrayIterator`2 [System.String、System.Byte]'型のオブジェクトをキャストして 'System.Byte []'と入力できません。'WhereSelectArrayIterator`2 [System.String、System.Byte]'型のオブジェクトをキャストして 'System.Byte []'と入力できません。 Vb.net

ここでのオープンとコード

開くファイルのコードを保存します:ここに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 

答えて

0

拡張メソッドでありますクラスIEnumerable(Of T)のオブジェクトを呼び出すクラスEnumerableは、Selectメソッドのように、通常は配列を返しません。彼らは通常、IEnumerable(Of T)を実装するいくつかの型を返します。特定のタイプは一般的に重要ではありません。配列が必要な場合は、そのオブジェクトに対してToArrayを呼び出す必要があります。 ToListも同様にList(Of T)を作成します。私は明示的な型宣言を削除した

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

注、すなわちAs Byte()、およびタイプが推測されてみましょう:それはあなたがこれを必要とすることを意味します。これは、より洗練されたコードを作成しますが、明示的な型を持つことが有用であると思うなら、それを行う必要はありません。私は無用のConvert.ToInt32コールも削除しました。

+0

大きなファイルを保存しようとすると、OutOfMemory例外が発生します。 – Coolvideos73

+0

データをチャンクで処理する必要がありますが、特に新しい質問でそのことを尋ねることをお勧めします。 – jmcilhinney

関連する問題