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 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!
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 ClassOra 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.