Dunque, riepiloghiamo: uno stream può essere letto con metodi diversi:
- Read, che ha bisogno di un buffer;
- ReadByte, che legge un byte alla volta;
- Per mezzo di un Reader, che è un oggetto a parte.
Miei appunti liberi, senza pretesa di dire necessariamente sempre cose giuste o sensate, durante l'apprendimento e la pratica della programmazione
Imports System.IO Module Module1 Dim corrente As New FileStream("c:\users\antonello\desktop\voce.wav", FileMode.Open) Dim destinazione(&H100) As Byte Sub Main() corrente.Read(destinazione, 0, destinazione.Length) For n = 0 To destinazione.Length - 1 Console.Write(Chr(destinazione(n))) Next Console.ReadKey() End Sub End Module
RIFFD☻☺ WAVEfmt ► ☺ ☺ ◄+ ◄+ ☺ data ☻☺ ????⌂???????????????????⌂??????????⌂⌂⌂ ????⌂???????????????????⌂??⌂???????⌂???⌂?⌂?????⌂??????⌂????????⌂⌂???????????⌂??? ????????????⌂????⌂⌂???⌂?⌂???⌂??????????????????????????????????⌂???????????⌂???⌂ ⌂????⌂??????⌂⌂?
Imports System.IO Module Module1 Dim corrente As New MemoryStream Dim sorgente() As Byte = {1, 2, 3, 4, 5} Sub Main() corrente.Write(sorgente, 0, 3) Dim result As Integer corrente.Position = 1 result = corrente.ReadByte() Console.WriteLine(result) Console.ReadKey() End Sub End ModuleHo scritto sullo stream prelevando da una matrice di bytes.
Imports System.IO Module Module1 Dim corrente As New MemoryStream Dim sorgente() As Byte = {1, 2, 3, 4, 5} Sub Main() corrente.Write(sorgente, 0, 3) Dim result As Byte corrente.Position = 1 result = corrente.ReadByte() Console.WriteLine(result) Console.ReadKey() End Sub End ModuleSì, ottengo sempre risultati pertinenti.
Sub Main() corrente.Write(sorgente, 0, 3) Dim result As Byte result = corrente.ReadByte() Console.WriteLine(result) Console.ReadKey() End SubIl tipo di errore era questo:
Eccezione first-chance di tipo 'System.OverflowException' in Streams.exeche, usando un tipo Integar, non veniva più segnalato:
Sub Main() corrente.Write(sorgente, 0, 3) Dim result As Integer result = corrente.ReadByte() Console.WriteLine(result) Console.ReadKey() End Subottenendo però questo risultato:
-1Il problema era che non avevo reimpostato la posizione di lettura dell'oggetto MemoryStream, per cui la posizione, una volta effettuata la scrittura, restava impostata sull'ultimo byte, e il valore successivo era -1, che non può essere rappresentato in un tipo Byte, che è senza segno.
1111 1111 1111 1111 1111 1111 1111 1111dovrebbe essere la rappresentazione di -1 in un tipo Integer.
Sub Main()
corrente.Write(sorgente, 0, 3)
Dim result As UInt32
result = corrente.ReadByte()
Console.WriteLine(result)
Console.ReadKey()
End Sub
Ed ottengo sempre:
Eccezione first-chance di tipo 'System.OverflowException' in Streams.execome volevasi dimostrare.
Sub Main()
corrente.Write(sorgente, 0, 3)
Dim result As Byte
corrente.Position = 1
result = corrente.ReadByte()
Console.WriteLine(result)
Console.ReadKey()
End Sub
Ed ecco:
2Okay!