Lempel-Ziv-Welch算法

时间:2016-05-11 07:27:05

标签: vb.net algorithm

嘿伙计们,

我正在尝试在VB.NET中的字节级实现Lempel-Ziv-Welch算法。以下是目前代码的样子:

        Dim FileBytes As Byte() = {Convert.ToByte(12), Convert.ToByte(13), Convert.ToByte(12), Convert.ToByte(13), Convert.ToByte(12), Convert.ToByte(13)}
    Dim bw As New BitWriter(New BinaryWriter(New FileStream(output, FileMode.Create)))
    Dim ByteDictionary As New Dictionary(Of Byte(), Integer)

    Dim DictionaryN As Integer = 1
    Dim DictionaryMax As Integer = 4048
    Dim outputs As New List(Of Integer)


    Dim bts As New List(Of Byte)
    For index As Integer = 0 To FileBytes.Length - 1
        Dim currentbyte As Byte = FileBytes(index)

        If ContainsByte(ByteDictionary, AddToList(bts, currentbyte).ToArray) Then
            bts.Add(currentbyte)
        Else

            If bts.Count > 1 Then
                ByteDictionary.Add(bts.ToArray, 255 + DictionaryN)
                DictionaryN += 1
            Else
                ByteDictionary.Add(New Byte() {currentbyte}, currentbyte)
            End If

            Console.WriteLine(GetByteValue(ByteDictionary, bts.ToArray))
            bts.Clear()
            bts.Add(currentbyte)

        End If

    Next

End Sub
Public Function ContainsByte(ByVal dic As Dictionary(Of Byte(), Integer), ByVal bt As Byte()) As Boolean
    Dim flag = True
    For Each kp As KeyValuePair(Of Byte(), Integer) In dic

        If ByteArrayEquals(kp.Key, bt) Then
            Return True
        End If

    Next
    Return False
End Function
Public Function AddToList(ByVal list As List(Of Byte), ByVal bt As Byte) As List(Of Byte)
    Dim newlist = New List(Of Byte)(list)
    newlist.Add(bt)
    Return newlist
End Function
Public Function ByteArrayEquals(ByVal first As Byte(), ByVal second As Byte()) As Boolean
    If first.Length = second.Length Then
        Dim flag = True
        For index As Integer = 0 To first.Length - 1
            If first(index) <> second(index) Then
                flag = False
            End If
        Next
        Return flag
    Else
        Return False
    End If
End Function


Public Function GetByteValue(ByVal dic As Dictionary(Of Byte(), Integer), ByVal bt As Byte()) As Integer
    For Each kp As KeyValuePair(Of Byte(), Integer) In dic

        If ByteArrayEquals(kp.Key, bt) Then
            Return kp.Value
        End If
    Next
End Function

我的实施背后的想法来自https://www.cs.cf.ac.uk/Dave/Multimedia/node214.html。但不知何故它不起作用,它只是输出输入字节。这有什么问题?

1 个答案:

答案 0 :(得分:0)

主要问题是这两行:

        If bts.Count > 1 Then
            ByteDictionary.Add(bts.ToArray, 255 + DictionaryN)

在这两行中你都使用bts,你应该使用bts + currentByte,即你需要类似

的内容
    Dim currentbyte As Byte = FileBytes(index)
    Dim btsPlusCurrentByte As List(Of Byte) = AddToList(bts, currentbyte)

    If ContainsByte(ByteDictionary, btsPlusCurrentByte.ToArray) Then
        bts.Add(currentbyte)
    Else
        If btsPlusCurrentByte.Count > 1 Then
            ByteDictionary.Add(btsPlusCurrentByte.ToArray, 255 + DictionaryN)

另一个问题是,您将使用bts中剩余的数据完成循环,但是我认为您之后需要一个块来执行此操作。只做

可能是安全的
Console.WriteLine(GetByteValue(ByteDictionary, bts.ToArray))

Next之后再次,但我还没有仔细考虑过这个问题。

我也认为你应该能够使用.NET自己的内置函数而不是你的四个辅助函数。