Клас MPPC

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Клас MPPC

Сообщение Res5 » 09.12.2013 (Пн) 23:52

Вобщем я попытался переписать класс с шарпа(http://pastebin.com/VrtAB4QQ , который я с трудом воспринимаю(чего стоят одни листы байт) ) на vb6.
К сожалению он не работает так как нужно, вернее не работает вовсе. Пожалуйста помогите разобратсья/найти ошибки.
Код: Выделить всё
Option Explicit

Private code1 As Long
Private code2 As Long
Private code3 As Long
Private code4 As Long


Private packedOffset As Byte


Private packedBytes() As Byte
Private unpackedBytes() As Byte
Private unpackedChunk() As Byte


Public Sub MppcUnpacker()

code3 = 0
code4 = 0

ReDim packedBytes(0)
ReDim unpackedBytes(0)

End Sub


Public Function Unpack(packedByte() As Byte) As Byte()
Dim outB As Byte
Dim size As Long
packedBytes = packedByte
'unpackedChunk = new List<byte>();
If (UBound(unpackedBytes)) >= (10240 - 1) Then

ReDim Preserve unpackedBytes(2048)


            Do
                If code3 = 0 Then
                    If HasBits(4) Then
                        If GetPackedBits(1) = 0 Then
                            ' 0-xxxxxxx
                            code1 = 1
                            code3 = 1
                        Else
                            If GetPackedBits(1) = 0 Then
                                ' 10-xxxxxxx
                                code1 = 2
                                code3 = 1
                            Else
                                If GetPackedBits(1) = 0 Then
                                    ' 110-xxxxxxxxxxxxx-*
                                    code1 = 3
                                    code3 = 1
                                Else
                                    If GetPackedBits(1) = 0 Then
                                        ' 1110-xxxxxxxx-*
                                        code1 = 4
                                        code3 = 1
                                    Else
                                        ' 1111-xxxxxx-*
                                        code1 = 5
                                        code3 = 1
                                    End If
                                End If
                            End If
                        End If
                    Else
                        Exit Do
                    End If
                ElseIf code3 = 1 Then
                    If code1 = 1 Then
                        If HasBits(7) Then
                            outB = GetPackedBits(7)
                            ReDim Preserve unpackedChunk(UBound(unpackedChunk) + 1)
                            unpackedChunk(UBound(unpackedChunk)) = outB
                           
                           
                            ReDim Preserve unpackedBytes(UBound(unpackedBytes) + 1)
                            unpackedBytes(UBound(unpackedBytes)) = outB
                           
                       
                            code3 = 0
                        Else
                            Exit Do
                        End If
                    ElseIf code1 = 2 Then
                        If HasBits(7) Then
                            outB = GetPackedBits(7)
                            outB = outB Or &H80
                           
                            ReDim Preserve unpackedChunk(UBound(unpackedChunk) + 1)
                            unpackedChunk(UBound(unpackedChunk)) = outB
                           
                           
                            ReDim Preserve unpackedBytes(UBound(unpackedBytes) + 1)
                            unpackedBytes(UBound(unpackedBytes)) = outB
                            code3 = 0
                        Else
                            Exit Do
                        End If
                    ElseIf code1 = 3 Then
                        If HasBits(13) Then
                            code4 = CInt(Fix(GetPackedBits(13))) + &H140
                            code3 = 2
                        Else
                            Exit Do
                        End If
                    ElseIf code1 = 4 Then
                        If HasBits(8) Then
                            code4 = CInt(Fix(GetPackedBits(8))) + &H40
                            code3 = 2
                        Else
                            Exit Do
                        End If
                    ElseIf code1 = 5 Then
                        If HasBits(6) Then
                            code4 = CInt(Fix(GetPackedBits(6)))
                            code3 = 2
                        Else
                            Exit Do
                        End If
                    End If
                ElseIf code3 = 2 Then
                    If code4 = 0 Then
                        ' Guess !!!
                        If packedOffset <> 0 Then
                            packedOffset = 0
                           ' packedBytes.RemoveAt (0)
                        End If
                        code3 = 0
                        'Continue Do
                    End If
                    code2 = 0
                    code3 = 3
                ElseIf code3 = 3 Then
                    If HasBits(1) Then
                        If GetPackedBits(1) = 0 Then
                            code3 = 4
                        Else
                            code2 = code2 + 1
                        End If
                    Else
                        Exit Do
                    End If
                ElseIf code3 = 4 Then
                    Dim copySize As Long

                    If code2 = 0 Then
                        copySize = 3
                    Else
                         size = code2 + 1

                        If HasBits(size) Then
                            copySize = CInt(Fix(GetPackedBits(size))) + (shl(1, size))
                        Else
                            Exit Do
                        End If
                    End If

                    Copy code4, copySize, unpackedChunk
                    code3 = 0
                End If
            Loop

            Unpack = unpackedChunk



End If




End Function








Private Sub Copy(shift As Long, size As Long, ByRef unpackedChunkData() As Byte)
Dim i As Long, a As Long, pIndex As Long, b As Byte

           
           
For i = 0 To (size - 1)
pIndex = UBound(unpackedBytes) - shift

If pIndex < 0 Then
Exit Sub
End If


b = unpackedBytes(pIndex)

ReDim Preserve unpackedBytes(UBound(unpackedBytes) + 1)
unpackedBytes(UBound(unpackedBytes)) = b


ReDim Preserve unpackedChunkData(UBound(unpackedChunkData) + 1)
unpackedChunkData(UBound(unpackedChunkData)) = b

           
Next
End Sub








Public Function GetPackedBits(bitCount As Long) As Long
Dim alBitCount As Long, AlByteCount As Long, freeBytes   As Long
Dim v As Long
Dim s As Byte
Dim i As Long

If bitCount > 16 Then
GetPackedBits = 0
Exit Function
End If

If Not (HasBits(bitCount)) Then
'bitCount = bitCount / 0
End If

alBitCount = bitCount + packedOffset
AlByteCount = (alBitCount + 7) / 8

i = 0

For i = 0 To AlByteCount

v = v Or shl(packedBytes(i), (24 - i * 8))

Next

v = shl(v, packedOffset)
v = shr(v, (32 - bitCount))


packedOffset = packedOffset + CByte(bitCount)

freeBytes = packedOffset / 8

If freeBytes <> 0 Then
ReDim Preserve packedBytes(freeBytes)
End If

packedOffset = packedOffset Mod 8

GetPackedBits = v


End Function




Private Function HasBits(count As Long) As Boolean

HasBits = ((UBound(packedBytes) * 8 - packedOffset) >= count)

End Function
       




Public Function shl(ByVal Value As Long, ByVal shift As Byte) As Long
    shl = Value
    If shift > 0 Then
        Dim i As Byte
        Dim m As Long
        For i = 1 To shift
            m = shl And &H40000000
            shl = (shl And &H3FFFFFFF) * 2
            If m <> 0 Then
                shl = shl Or &H80000000
            End If
        Next i
    End If
End Function






Public Function shr(ByVal Value As Long, ByVal shift As Byte) As Long
    Dim i As Byte
    shr = Value
    If shift > 0 Then
        shr = Int(shr / (2 ^ shift))
    End If
End Function

Вложения
Данные.rar
cr - вход, ucr - выход
(7.44 Кб) Скачиваний: 101

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 23.12.2013 (Пн) 5:03

Хех. Досадно но в вб6 нет нетипизированных пременных. Вывод - нужно писать на vb.net. :cry:

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 23.12.2013 (Пн) 6:04

Многие ошибки я сам нашел. Поставленная задача значительно упростилась.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Клас MPPC

Сообщение Хакер » 23.12.2013 (Пн) 8:17

Res5 писал(а):Хех. Досадно но в вб6 нет нетипизированных пременных.

Ты с какой планеты? Конечно же они есть в VB6.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 23.12.2013 (Пн) 21:29

целое -беззнаковое 4 байта?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Клас MPPC

Сообщение Хакер » 23.12.2013 (Пн) 21:45

Есть Decimal. Если если проникнуться мыслью, что знаковость играет роль только при сравнении и рендеринге в текст — то и Long сойдёт.

Лучше объясни, что тебе нужно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 23.12.2013 (Пн) 22:17

децимал не пойдет тебе для алгоритма т.к. он в памяти хранится
v |= (uint)(packedBytes[i]) << (24 - i * 8);

v в последствии - сравнивается\является длинной\является контрольной суммой.

v <<= packedOffset;
v >>= 32 - bitCount;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Клас MPPC

Сообщение Хакер » 23.12.2013 (Пн) 22:21

Если ты думаешь, что кому-то стало понятнее, что тебе нужно, то правда заключается в том, что никому не стало.
Писать понятно в твоих же интересах, если хочешь получить какой-то ответ.

Единственное, что есть, это код большого класса, с которым, я так понимаю, всем лень разбираться. Тебе же, в свою очередь, лень свой вопрос конкретизировать и разбить на мелкие и точные.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 23.12.2013 (Пн) 23:18

в 2х словах - потоковое чтение N бит и запись в переменную размером 4б с целью получения числа с некими преобразованиями, число может быть длинной следующего чтения, стадии чтения.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Клас MPPC

Сообщение Хакер » 23.12.2013 (Пн) 23:25

Нда, тяжелый случай.

Что мне делать? Умолять тебя задать нормальные вопросы? Или просто оставить тебе этот топик, чтобы ты мог пронаблюдать и убедиться, что никому не охота не видя вопроса догадываться, что же хочет спросить этот странный человек?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 23.12.2013 (Пн) 23:35

Нужен целый беззнаковый 4байтный тип. Проблема в том что лонг или децимал при выше указанных действиях становится отрицательным.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Клас MPPC

Сообщение iGrok » 24.12.2013 (Вт) 0:01

Res5 писал(а):Нужен целый беззнаковый 4байтный тип.

Нету такого.

Res5 писал(а):Проблема в том что лонг или децимал при выше указанных действиях становится отрицательным.

И с каких пор это проблема?

Res5 писал(а):число может быть длинной следующего чтения, стадии чтения.

А часто там больше 2Гб читается?
Приведи пример реально возникающей из-за этого проблемы.

Ну и, в конце концов, можно преобразовывать в тот же Decimal перед подобными операциями.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.12.2013 (Вт) 0:14

iGrok писал(а):А часто там больше 2Гб читается?

Там что-то типа вычисления хэша или кодирования, мне было лень разбираться, так что размер считываемого тут не при чём, дело именно в вычислениях.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Клас MPPC

Сообщение Хакер » 24.12.2013 (Вт) 1:41

Ещё раз, разница между знаковым и беззнаковым проявляется только в двух случаях:
  • Если такие числа сравниваются между собой
  • Если число надо преобразить в человеко-понятную форму

Ну и да, ещё при проверке на overflow.

Выложить что-ли свой модуль для работы с беззнаковыми числами через long-и?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Клас MPPC

Сообщение Res5 » 24.12.2013 (Вт) 7:09

Нестоит... Я понял какой это изврат-делать такие простые вещи в vb6. :(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Клас MPPC

Сообщение Хакер » 24.12.2013 (Вт) 7:48

Окей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 47

    TopList