Sorry, im vorherigen Beitrag ist mir in der MyByteExchangerStream-Klasse leider ein Fehler unterlaufen (und konnte ihn nicht mehr editieren).
Hier die korrigierte Version.
Option Strict On
Public Class MyByteExchangerStream
Inherits System.IO.Stream
Private ReadOnly ausgabeStream As System.IO.Stream
Private ReadOnly suchenBytes() As Byte
Private ReadOnly ersetzenBytes() As Byte
Private aktSuchPos As Integer = 0
Public Sub New(ausgabeStream As System.IO.Stream, ByVal suchenBytes() As _
Byte, ByVal ersetzenBytes() As Byte)
If ausgabeStream Is Nothing Or suchenBytes Is Nothing Or ersetzenBytes _
Is Nothing Then Throw New NullReferenceException()
If suchenBytes.Length = 0 Then Throw New ArgumentException()
Me.ausgabeStream = New System.IO.BufferedStream(ausgabeStream)
Me.suchenBytes = suchenBytes
Me.ersetzenBytes = ersetzenBytes
End Sub
Public Overrides ReadOnly Property CanRead As Boolean
Get
Return False
End Get
End Property
Public Overrides ReadOnly Property CanSeek As Boolean
Get
Return False
End Get
End Property
Public Overrides ReadOnly Property CanWrite As Boolean
Get
Return True
End Get
End Property
Public Overrides Sub Flush()
End Sub
Public Overrides ReadOnly Property Length As Long
Get
Throw New NotSupportedException()
End Get
End Property
Public Overrides Property Position As Long
Get
Throw New NotSupportedException()
End Get
Set(value As Long)
Throw New NotSupportedException()
End Set
End Property
Public Overrides Function Read(buffer() As Byte, offset As Integer, count _
As Integer) As Integer
Throw New NotSupportedException()
End Function
Public Overrides Function Seek(offset As Long, origin As _
System.IO.SeekOrigin) As Long
Throw New NotSupportedException()
End Function
Public Overrides Sub SetLength(value As Long)
Throw New NotSupportedException()
End Sub
Public Overrides Sub Write(buffer() As Byte, offset As Integer, count As _
Integer)
For i As Integer = offset To offset + count - 1
WriteByte(buffer(i))
Next
End Sub
Public Overrides Sub WriteByte(value As Byte)
If value = suchenBytes(aktSuchPos) Then 'Übereinstimmung gefunden
aktSuchPos += 1
If aktSuchPos = suchenBytes.Length Then 'Komplett, jetzt
' ErsetzenBytes schreiben
ausgabeStream.Write(ersetzenBytes, 0, ersetzenBytes.Length)
aktSuchPos = 0
End If
Else ' Keine Übereinstimmung, falls Puffer vorhanden, leeren
If aktSuchPos > 0 Then
'Schauen, ob es innerhalb des Suchmusters eine weitere
' Übereinstimmung gibt
Dim gefundenStartpos As Integer = -1
For j As Integer = 1 To aktSuchPos
For z As Integer = j To aktSuchPos
Dim vergleichByte As Byte = If(z = aktSuchPos, value, _
suchenBytes(z))
If vergleichByte <> suchenBytes(z - j) Then
Exit For
ElseIf z = aktSuchPos Then
gefundenStartpos = j
Exit For
End If
Next
If gefundenStartpos >= 0 Then Exit For
Next
If gefundenStartpos >= 0 Then
ausgabeStream.Write(suchenBytes, 0, gefundenStartpos)
aktSuchPos += -gefundenStartpos + 1
Else 'keine weitere Übereinstimmung gefunden
ausgabeStream.Write(suchenBytes, 0, aktSuchPos)
ausgabeStream.WriteByte(value)
aktSuchPos = 0
End If
Else
ausgabeStream.WriteByte(value)
End If
End If
End Sub
Protected Overrides Sub Dispose(disposing As Boolean)
If aktSuchPos > 0 Then
ausgabeStream.Write(suchenBytes, 0, aktSuchPos)
End If
ausgabeStream.Dispose()
End Sub
End Class
Beitrag wurde zuletzt am 09.04.11 um 03:07:31 editiert. |