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 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 Module
Ho 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 Module
Sì, ottengo sempre risultati pertinenti.
Sub Main()
corrente.Write(sorgente, 0, 3)
Dim result As Byte
result = corrente.ReadByte()
Console.WriteLine(result)
Console.ReadKey()
End Sub
Il 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 Sub
ottenendo 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!
Imports System.IO
Public Class Form1
Dim memoria As Stream
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
memoria = New MemoryStream
End Sub
End Class
Ora devo vedere come si scrive e si legge da questo stream...
memoria = New MemoryStream
memoria.WriteByte(12)
Come si legge dallo stream?
memoria = New MemoryStream
memoria.WriteByte(12)
Dim risultato As Integer
memoria.Position = 0
risultato = memoria.ReadByte()
MsgBox(risultato)
E ottengo 12.
memoria = New MemoryStream
memoria.WriteByte(12)
memoria.WriteByte(4)
Leggo il byte in posizione 1.
memoria = New MemoryStream
memoria.WriteByte(12)
memoria.WriteByte(4)
Dim risultato As Integer
memoria.Position = 1
risultato = memoria.ReadByte()
MsgBox(risultato)
E ottengo 4.