Вопрос: Декодер Base64 | Добавлено: 02.09.07 00:12 |
Автор вопроса: ![]() |
Приветствую Вас снова!
Получаю Email по POP3 с прекреплённым файлом. Использую при этом уже готовую библиотеку OSPOP3.dll http://www.ostrosoft.com/pop3_component.asp В библиотеке уже предусмотренна функция декодеровки Base64. Требуется отследить статус декодеровки в процентах (ProgressBar). Библиотека этого не предусматривает. Т.е. функция перекодировки не возвращает ничего... Соответсвенно требуется внешний декодер, который можно было бы редактирыватьл и добавить в него ProgressBar. У кого-нибудь есть рабочий декодер? Нашел парочку, но они либо глючат, либо вообще не работают... Буду очень благодарен за помощь! |
Ответы | Всего ответов: 22 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 02.09.07 02:15 |
Вот модуль для Base64
из Test Programm For Compressors V1.04 Весь пример не могу кинуть - очень большой т.к. куча разных (де)компрессоров Option Explicit
Private Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" Public Sub Base64Array_Encode(ByteArray() As Byte) Dim OutStream() As Byte Dim OutPos As Long Dim InpPos As Long Dim c1, c2, c3 As Integer ReDim OutStream(500) InpPos = 0 OutPos = 0 Do While InpPos <= UBound(ByteArray) c1 = ReadValue(ByteArray, InpPos) c2 = ReadValue(ByteArray, InpPos) c3 = ReadValue(ByteArray, InpPos) Call AddValueToStream(OutStream, OutPos, mimeencode(Int(c1 / 4))) Call AddValueToStream(OutStream, OutPos, mimeencode((c1 And 3) * 16 + Int(c2 / 16))) If InpPos - 2 <= UBound(ByteArray) Then Call AddValueToStream(OutStream, OutPos, mimeencode((c2 And 15) * 4 + Int(c3 / 64))) End If If InpPos - 1 <= UBound(ByteArray) Then Call AddValueToStream(OutStream, OutPos, mimeencode(c3 And 63)) End If Loop ReDim ByteArray(OutPos - 1) Call CopyMem(ByteArray(0), OutStream(0), OutPos) End Sub Public Sub Base64Array_Decode(ByteArray() As Byte) Dim OutStream() As Byte Dim OutPos As Long Dim InpPos As Long Dim w1, w2, w3, w4 As Integer ReDim OutStream(500) InpPos = 0 OutPos = 0 Do While InpPos < UBound(ByteArray) w1 = mimedecode(ReadValue(ByteArray, InpPos)) w2 = mimedecode(ReadValue(ByteArray, InpPos)) w3 = mimedecode(ReadValue(ByteArray, InpPos)) w4 = mimedecode(ReadValue(ByteArray, InpPos)) If w2 >= 0 Then Call AddValueToStream(OutStream, OutPos, (w1 * 4 + Int(w2 / 16)) And 255) If w3 >= 0 Then Call AddValueToStream(OutStream, OutPos, (w2 * 16 + Int(w3 / 4)) And 255) If w4 >= 0 Then Call AddValueToStream(OutStream, OutPos, (w3 * 64 + w4) And 255) Loop ReDim ByteArray(OutPos - 1) Call CopyMem(ByteArray(0), OutStream(0), OutPos) End Sub Private Function mimeencode(w As Integer) As Byte If w >= 0 Then mimeencode = ASC(Mid$(Base64, w + 1, 1)) Else mimeencode = 0 End Function Private Function mimedecode(A As Integer) As Integer If A = 0 Then mimedecode = -1: Exit Function mimedecode = InStr(Base64, Chr ![]() End Function Private Function ReadValue(FromArray() As Byte, FromPos As Long) As Integer If FromPos <= UBound(FromArray) Then ReadValue = FromArray(FromPos) Else ReadValue = 0 End If FromPos = FromPos + 1 End Function Private Sub AddValueToStream(ToStream() As Byte, ToPos As Long, Number As Byte) If ToPos > UBound(ToStream) Then ReDim Preserve ToStream(ToPos + 100) ToStream(ToPos) = Number ToPos = ToPos + 1 End Sub |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 21 |
Профиль | Цитата | #2 | Добавлено: 02.09.07 03:06 |
Два вопроса:
1. Как переменную содержащую body прикреплённого к письму файла(String) перевести ByteArray()? 2. Как всё это добро сохранить в фаил? Т.е. получить конечный фаил если это например фотография... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 02.09.07 11:20 |
1. StrConv
2. dim nf as integer nf = freefile() open nf for binary acces write lock read as nf put nf, , byte_array close nf |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #4 | Добавлено: 02.09.07 12:57 |
Если речь идет о VB6, то по первому вопросу могу предложить более простой вариант:
Dim s As String: s = "Превед!"
Dim b() As Byte: b = s |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 21 |
Профиль | Цитата | #5 | Добавлено: 02.09.07 13:49 |
Речь идёт о VB6...
Спасибо всем за помощь... Всё собрал! Всё работает! Программа ошибок никаких не выдаёт, но сохранённый фаил (в моём случае это фотография) всегда получается размером в 1 байт вместо мегобайта... В чём может быть проблема? Помогите пожалуйста... Option Explicit Private Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Sub Main() Dim arr() As Byte 'body - это строка, тело прикреплённого файла, полученная с почтового ящика. arr = StrConv(fileCont, vbFromUnicode) Call Base64Array_Encode(arr) End Sub ublic Sub Base64Array_Encode(ByteArray() As Byte) Dim OutStream() As Byte Dim nf As Integer Dim OutPos As Long Dim InpPos As Long Dim c1, c2, c3 As Integer Dim fname As String ReDim OutStream(500) InpPos = 0 OutPos = 0 Do While InpPos <= UBound(ByteArray) c1 = ReadValue(ByteArray, InpPos) c2 = ReadValue(ByteArray, InpPos) c3 = ReadValue(ByteArray, InpPos) Call AddValueToStream(OutStream, OutPos, mimeencode(Int(c1 / 4))) Call AddValueToStream(OutStream, OutPos, mimeencode((c1 And 3) * 16 + Int(c2 / 16))) If InpPos - 2 <= UBound(ByteArray) Then Call AddValueToStream(OutStream, OutPos, mimeencode((c2 And 15) * 4 + Int(c3 / 64))) End If If InpPos - 1 <= UBound(ByteArray) Then Call AddValueToStream(OutStream, OutPos, mimeencode(c3 And 63)) End If Loop ReDim ByteArray(OutPos - 1) Call CopyMemory(ByteArray(0), OutStream(0), OutPos) 'Здесь я прописываю сохранение в фаил. В данно случае фотография (jpg) nf = FreeFile() fname = "c:/fff.jpg" Open fname For Binary Access Write Lock Read As nf Put nf, , ByteArray(0) Close nf End Sub Private Function mimeencode(w As Integer) As Byte If w >= 0 Then mimeencode = Asc(Mid$(Base64, w + 1, 1)) Else mimeencode = 0 End Function Private Function ReadValue(FromArray() As Byte, FromPos As Long) As Integer If FromPos <= UBound(FromArray) Then ReadValue = FromArray(FromPos) Else ReadValue = 0 End If FromPos = FromPos + 1 End Function Private Sub AddValueToStream(ToStream() As Byte, ToPos As Long, Number As Byte) If ToPos > UBound(ToStream) Then ReDim Preserve ToStream(ToPos + 100) ToStream(ToPos) = Number ToPos = ToPos + 1 End Sub |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #6 | Добавлено: 02.09.07 13:53 |
Put nf, , ByteArray(0) - это неправильно
Put nf, , ByteArray() |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 21 |
Профиль | Цитата | #7 | Добавлено: 02.09.07 14:08 |
Подправил... Теперь вообще конечный фаил получается 3,6 мега вместо одного мега и естестествено не открывается...
Ещё ошибки где-то есть... ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #8 | Добавлено: 02.09.07 14:09 |
А ты уверен, что там base64 кодировка? |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #9 | Добавлено: 02.09.07 14:15 |
Еще вижу ошибку..
ReDim ByteArray(OutPos - 1) Правильно: ReDim Preserve ByteArray(OutPos - 1) |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #10 | Добавлено: 02.09.07 14:16 |
Кхм.. Нет с предыдущим постом я погорячился ![]() |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #11 | Добавлено: 02.09.07 14:18 |
А этта.. Почему ты кодируешь свой массив в base64, а не наоборот. Разве не логичнее юзать функцию Base64_Decode()? |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 21 |
Профиль | Цитата | #12 | Добавлено: 02.09.07 14:26 |
Вот описание библиотеки которой пользуюсь:
http://www.ostrosoft.com/pop3_component.asp Смотри в самом низу - Methods: object.Save Там написано если кодеровка принятого файла Base64, то при сохранени он будет автоматически перекодирыван, т.е. это процедура внутри dll библиотеки. Если сохраняю этот же фаил с помощью библиотеки, то всё работает на ура. Значит фаил перекодируется, значит кодировка Base64. Плюс ко всему параметр object.ContentTransferEncoding (смотри в описании библиотеки) даёт именно Base64. А вот с внешним декодером не хочет работать. |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 56 |
Профиль | Цитата | #13 | Добавлено: 02.09.07 14:29 |
Значит все-таки нужно использовать не Encode, а Decode, не? |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 21 |
Профиль | Цитата | #14 | Добавлено: 02.09.07 14:33 |
Уфффф... Во я дурак... Уже меняю...
Я просто сутки не спал... Голова уже не варит! |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() Вопросов: 3 Ответов: 21 |
Профиль | Цитата | #15 | Добавлено: 02.09.07 14:38 |
Всё. Поменял... Теперь конечный фаил получается правильнго размера, но он не открывается...
Опять что-то не так... :/ Option Explicit
Private Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Sub Main() Dim arr() As Byte 'body - это строка, тело прикреплённого файла, полученная с почтового ящика. arr = StrConv(fileCont, vbFromUnicode) Call Base64Array_Decode(arr) End Sub Public Sub Base64Array_Decode(ByteArray() As Byte) Dim OutStream() As Byte Dim OutPos As Long Dim InpPos As Long Dim nf As Integer Dim fname As String Dim w1, w2, w3, w4 As Integer ReDim OutStream(500) InpPos = 0 OutPos = 0 Do While InpPos < UBound(ByteArray) w1 = mimedecode(ReadValue(ByteArray, InpPos)) w2 = mimedecode(ReadValue(ByteArray, InpPos)) w3 = mimedecode(ReadValue(ByteArray, InpPos)) w4 = mimedecode(ReadValue(ByteArray, InpPos)) If w2 >= 0 Then Call AddValueToStream(OutStream, OutPos, (w1 * 4 + Int(w2 / 16)) And 255) If w3 >= 0 Then Call AddValueToStream(OutStream, OutPos, (w2 * 16 + Int(w3 / 4)) And 255) If w4 >= 0 Then Call AddValueToStream(OutStream, OutPos, (w3 * 64 + w4) And 255) Loop ReDim ByteArray(OutPos - 1) Call CopyMem(ByteArray(0), OutStream(0), OutPos) nf = FreeFile() fname = "c:/fff.jpg" Open fname For Binary Access Write Lock Read As nf Put nf, , ByteArray() Close nf End Sub Private Function mimedecode(A As Integer) As Integer If A = 0 Then mimedecode = -1: Exit Function mimedecode = InStr(Base64, Chr ![]() End Function Private Function ReadValue(FromArray() As Byte, FromPos As Long) As Integer If FromPos <= UBound(FromArray) Then ReadValue = FromArray(FromPos) Else ReadValue = 0 End If FromPos = FromPos + 1 End Function Private Sub AddValueToStream(ToStream() As Byte, ToPos As Long, Number As Byte) If ToPos > UBound(ToStream) Then ReDim Preserve ToStream(ToPos + 100) ToStream(ToPos) = Number ToPos = ToPos + 1 End Sub |
|