Uso un MemoryStream.
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.
In blocco. Quindi ho usato Write.
Write accetta come parametri la matrice da cui leggere, la posizione iniziale e la quantità di bytes. Legge solo da una matrice di bytes.
Per la lettura ho usato ReadByte che legge un byte alla volta.
Se invece avessi voluto leggere in blocco dentro una matrice di bytes, avrei dovuto usare Read.
Seguendo un esempio visto in rete, ho usato il tipo Integer per la variabile result in cui leggere il byte.
Ma potrei usare anche un tipo Byte?
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.
Ho ottenuto un errore, prima, usando il tipo Byte in questo modo:
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.
Invece il tipo Integer può rappresentare i numeri negativi:
1111 1111 1111 1111 1111 1111 1111 1111dovrebbe essere la rappresentazione di -1 in un tipo Integer.
Usando un tipo che non può essere con segno, invece, ottengo un errore.
La riprova di questo la ottengo usando un tipo Integer senza segno:
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.
Il fatto che ottengo -1 è dovuto al fatto che non ho resettato la posizione.
Rimedio subito e posso usare anche Byte (o anche Uint32):
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!
Nessun commento:
Posta un commento