Newsgroup: it.comp.lang.visual-basic
Titolo: [?3] ci riprovo ancora: lettura stream binary

Ri posto qui un mio vecchio post a cui non ho ricevuto risposta dopo averlo 
ripostato due volte... per favore questa volta non abbandonatemi...
***inzio post
Salve a tutti,
Ho un problema nella lettura "a pezzi" di uno stream binario...
Allora, faccio cosě:
Dim instream As New FileStream(inputFile, FileMode.Open, _
 FileAccess.Read, FileShare.None, 4096)
Dim outstream As New FileStream(outputFile, FileMode.Create)
Dim buffer(4095) As Byte 'Buffer di lettura
Do
Dim readbyte As Integer = instream.Read(buffer, 0, buffer.Length)
If readbyte = 0 Then Exit Do 'Se il file č finito esce dal ciclo
Dim encodedbyte() As Byte = Encode(buffer)
outstream.Write(encodedbyte, 0, encodedbyte.Length)
Loop
outstream.Flush()
instream.Flush()
Bene, questa funzione funziona perfettamente...
Perň quando vado a decriptare:
Dim instream As New FileStream(inputFile, FileMode.Open, _
FileAccess.Read, FileShare.None, 4096)
Dim outstream As New FileStream(outputFile, FileMode.Create)
Dim buffer(4095) As Byte 'Buffer di lettura
Do
Dim readbyte As Integer = instream.Read(buffer, 0, 4096) 'Scrive nel buffer
If readbyte = 0 Then Exit Do 'Se il file č finito esce dal ciclo
Debug.Print(readbyte & " " & buffer.Length)
Debug.Print(inputFile & " " & outputFile)
Dim decodebyte() As Byte = Decode(buffer) 'Decodifica i dati
outstream.Write(decodebyte, 0, decodebyte.Length) 'Scrive nel file
Loop
outstream.Flush()
instream.Flush()
La funzione Decode lancia un eccezione (file compromesso, non riesce a
decriptare la matrice di byte).
Funzione Decode:
Public Function Decode(ByVal input() As Byte) As Byte()
Dim rjm As RijndaelManaged = New RijndaelManaged()
rjm.KeySize = 128
rjm.BlockSize = 128
rjm.Key = ASCIIEncoding.ASCII.GetBytes(m_key)
rjm.IV = ASCIIEncoding.ASCII.GetBytes(m_iv)
Try
Dim output() As Byte =  _
rjm.CreateDecryptor().TransformFinalBlock(input, 0, input.Length)
Return output
Catch e As Exception
ShowErrore(TypeOfErrore.Decriptazione)
End Try
End Function
Penso di aver capito piů o meno il perche d questo fatto:
Quando si critta un file con rijndael le dimensioni aumentano
Ad es, per crittare un byte poi ne escono fuori 16.
Ma questo rapporto non č costante ((((((((((
Va da 0 a 1,5 ......
Che fare???
Grazie in anticipo,
-- 
Carmine ( 
pikachu...@gmail.com
 (Togli la scritta NOSPAM) )
Webmaster di The Total Site 4 : 
http://www.thetotalsite.it
MariokartDS Codice Amico: 532639027909 - CarmineC in MarioKartDS
"Un problema non č un problema se puň essere risolto" 

 Loop
Allora, senza provare il problema come aveva segnalato hal sta qui.
Tu leggi a blocchi di 4k, ma cosa succede se l'ultimo non è 4k esatti?
Ad ogni giro devi controllare che se i rimanenti sono > di BUFFER_SIZE leggi 
BUFFER_SIZE altrimenti leggi solo la differenza.
Non puoi decodificare buffer assumendo che sia sempre di 4k perchè non è 
così.
Ciao 

 non è così.
Ma come?
Allora, con readbyte trovo i buffer rimanenti e quindi controllo se sono 
maggiori di 4k, se sono maggiori faccio tutto normalmente... ma se sono 
minori?
Dovrei riempire lo spazio rimanente usando valori standard? come?
Bye,
-- 
Carmine ( 
pikachu...@gmail.com
 (Togli la scritta NOSPAM) )
Webmaster di The Total Site 4 : 
http://www.thetotalsite.it
MariokartDS Codice Amico: 532639027909 - CarmineC in MarioKartDS
"Un problema non è un problema se può essere risolto" 

 Dovrei riempire lo spazio rimanente usando valori standard? come?
Su, dài, ce la puoi fare, non è difficile :)
mettiamo che questo sia il tuo stream, dove un * equivale a 1k di byte
**** **** ***
Se tu leggi a blocchi di 4k è ovvio che l'ultimo blocco non riempirà il 
buffer completamente ma solo per 3k, quindi ad ogni loop devi controllare 
che ti resti altro da leggere dopo, altrimenti il tuo buffer lo devi 
ridimensionare in modo da farci stare solo la parte rimanente (3k).
Tu leggi tutto in buffer fissi da 4k, ma i dati letti nell'ultimo giro in 
realtà sono meno ottenendo così un buffer "reale" più grosso di quello 
necessario, probabilmente riempito a 0, il che provoca la corruzione dei 
dati (vi sono byte in eccesso che la Decode non sa come gestire).
Chiaro?
Ciao 

 Chiaro?
Mmm però anche mettendo come buffer uno di 1 byte poi comunque non funziona!
E teoricamente tutti sono multipli di 1...
Come mai?


Ok ragazzi allora ho provato a fare in modo che se sono meno di 4kb legge 
solo quelli:
Public Sub EncodeFile(ByVal inputFile As String, ByVal outputFile As String)
Try
Using instream As New FileStream(inputFile, FileMode.Open, _
FileAccess.Read, FileShare.None, 4096) 'Open the stream for read
Using outstream As New FileStream(outputFile, FileMode.Create)
Dim buffer(4095) As Byte 'Buffer di lettura
Do
Dim readbyte As Integer = instream.Read(buffer, 0, 4095) 'Scrive nel buffer
If readbyte = 0 Then Exit Do 'Se il file è finito esce dal ciclo
Dim encodedbyte() As Byte = Encode(buffer) 'Codifica i dati
If readbyte >= 4095 Then 'Controlla che siano rimasti almeno 4kb
outstream.Write(encodedbyte, 0, 4095) 'Scrive nel file
Else
outstream.Write(encodedbyte, 0, readbyte) 'Scrive nel file
Debug.Print("Chiped < 4kb")
End If
Loop
outstream.Flush()
instream.Flush()
End Using
End Using
Catch ex As Exception
Debug.Print(ex.ToString)
End Try
End Sub
Public Sub DecodeFile(ByVal inputFile As String, ByVal outputFile As String)
Try
Using instream As New FileStream(inputFile, FileMode.Open, _
FileAccess.Read, FileShare.None, 4096) 'Open the stream for read
Using outstream As New FileStream(outputFile, FileMode.Create)
Dim buffer(4095) As Byte 'Buffer di lettura
Do
Dim readbyte As Integer = instream.Read(buffer, 0, 4095) 'Scrive nel buffer
If readbyte = 0 Then Exit Do 'Se il file è finito esce dal ciclo
'Debug.Print(readbyte & " " & buffer.Length)
'Debug.Print(inputFile & " " & outputFile)
Dim decodebyte() As Byte = Decode(buffer) 'Decodifica i dati
If readbyte >= 4095 Then 'Controlla che siano rimasti almeno 4kb
outstream.Write(decodebyte, 0, 4095) 'Scrive nel file
Debug.Print("Successfully chiped 4kb")
Else
outstream.Write(decodebyte, 0, readbyte) 'Scrive nel file
End If
Loop
outstream.Flush()
instream.Flush()
End Using
End Using
Catch ex As Exception
Debug.Print(ex.ToString)
End Try
Ma continua a non funzionare :( :( :(
Vi prego aiutatemi...
