STRING -> Byte Array -> String ... Опять

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

STRING -> Byte Array -> String ... Опять

Сообщение Wolfie » 04.01.2007 (Чт) 18:38

Приветствую! Возникла неясность:
    Считал файл в переменную (String)
    Присвоил строку динамич. массиву байт
    обнаружил, что верхняя граница массива в 2 раза больше длины строки
VB6
Код: Выделить всё
dim body as string, b() as byte
Open Command For Binary As #1
Body = String(LOF(1), 0)
Get #1, 1, Body
b=body
В чем дело? Файл - exe, юникод не при чем вроде?
Последний раз редактировалось Wolfie 04.01.2007 (Чт) 21:03, всего редактировалось 3 раз(а).
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.01.2007 (Чт) 18:40

Шикарно.
В цитаты.
Ещё один - причём весьма оригинальный - думающий, что текстовые файлы отличаются от двоичных.
Сходи в блог Тёмыча, статью почитай как раз про это.
Ужос.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 18:48

Для ясности: VB считает, что содержимое String всегда в Юникоде. Откуда бы оно не взялось и как бы потом не использовалось.
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 04.01.2007 (Чт) 20:12

tyomitch Спасибо - ясно теперь все - применил StrConv с fromUnicode и стало как надо... вроде.
GSerg я всего лишь имел ввиду предположение, что у ЕХЕ в отличии от скажем простого текстового файла всегда АНСИ. А то может бейсик сам по себе решил что надо даже в BINARY понимать что два байта на символ :lol:

Подскажите, может вопрос не очень умный, но все же:
Как програмно СRС посчитать? Все байты в файле сложить (в сумму)?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 20:23

А всего-то, что нужно -- слово, выделенное красным, ввести по ссылке вверху страницы, которая тоже выделена красным ;-)
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 04.01.2007 (Чт) 20:38

Ввел - еще до поста, потом ввел еще раз после - нашел http://bbs.vbstreets.ru/viewtopic.php?t=27507&postdays=0&postorder=asc&start=30 , где разбирается эта тема, не без Вашего участия. Но увы - признаюсь - не понял в итоге - как этот алгоритм на бейсике реализовать? Переводить каждый байт в биты?
Код: Выделить всё
X^16 + X^15 + X^2 + 1


Нельзя ли для путешествующих в бронепоезде изложить в двух строках без АСМ что мне проделать с этой формулой? Буду признателен
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 20:52

Ай, мастера поиска...
http://bbs.vbstreets.ru/viewtopic.php?p=64447#64447
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 04.01.2007 (Чт) 21:02

tyomitch СПАСИБО - буду использовать :wink:
Но я не просто так это искал - худшие опасения оправдались - бейсик через strconv fromUnicode убил не просто символы в знаки вопроса но и еще потерял после put половину своего размера.... Выручайте - что делать все же для

STRING -> Byte Array -> String
28 kb ------- 57 kb -------- 16 kb


Применил потом обратно
body=strconv(b,vbunicode)
и на выходе стало 28 кб, и этот экзешник даже запускается - но вот значок он свой потерял - значит опять не чисто перекодировлось?
Последний раз редактировалось Wolfie 04.01.2007 (Чт) 21:07, всего редактировалось 1 раз.
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 21:07

А что, читать из файла сразу в байтовый массив не проще? ;-)
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 04.01.2007 (Чт) 21:08

Попробую - а что это даст?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 21:11

Даст отсутствие String, Юникода, StrConv и всех связанных с ними проблем.
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 04.01.2007 (Чт) 22:14

Увы, не дало ! ))))) Стало веселее - пришлось отдельно делать
b=strconv(b,fromunicode) иначе ubound(b) возвращало 56 kb но дальше стало хуже: что со строкой
B = StrConv(B, vbUnicode) перед записью файла что без нее - галиматья из знаков вопросов.. просто после этой строки галиматьи меньше (самый смех был в том, что этот экзешник сработал - подвигал по дос-экрану курсор в разные позиции а потом выплюнул из принтера 2 листа пустых :lol: )

Кстати - нормально заработал вариант со строками (body) и с strconv туда-сюда-обратно - со значком был просто глюк кэша...

А с сохранением этих байт в файл я просто замучился... никак не идет
по этому алгоритму и его вариациям после msgbox'а
Код: Выделить всё
Sub main()

Dim body As String, B() As Byte, I As Long

Open Command For Binary As #1
B = String(LOF(1), 0)
Get #1, 1, B
B = StrConv(B, vbFromUnicode)

Open Environ("desk") & "\output.exe" For Binary As 2

MsgBox UBound(B)

B = StrConv(B, vbUnicode)
Put #2, 1, B
Close

End Sub


а это вот работает
Код: Выделить всё
Sub main()

Dim Body As String, B() As Byte

Open Command For Binary As #1
Body = String(LOF(1), 0)
Get #1, 1, Body
B = StrConv(Body, vbFromUnicode)

Open Environ("desk") & "\output.exe" For Binary As 2

MsgBox UBound(B)

Body = StrConv(B, vbUnicode)

Put #2, 1, Body
Close

End Sub


Где же "умирают" нормальные данные в итоге?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 22:30

Wolfie писал(а):Увы, не дало ! ))))) Стало веселее - пришлось отдельно делать
b=strconv(b,fromunicode) иначе ubound(b) возвращало 56 kb

Ещё бы. Убери "B = String(LOF(1), 0)", и вообще все строки из программы убери :-)
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 05.01.2007 (Пт) 16:18

tyomitch писал(а):Ещё бы. Убери "B = String(LOF(1), 0)", и вообще все строки из программы убери :-)
Убрал - результат - 0 байт на выходе, т.к. в массиве ни одного элемента и Ubound(b) ошибку выдает! :drunken: ??? ЧТо посоветуете?
Код: Выделить всё
Sub main()
Dim B() As Byte

Open Command For Binary As #1
Get #1, 1, B

Open Environ("desk") & "\output.exe" For Binary As 2
'MsgBox UBound(B) 'ERROR: Out of Range'
Put #2, 1, B

Close
End Sub
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 05.01.2007 (Пт) 17:45

:evil:
Код: Выделить всё

    Dim nFile As Integer:   nFile = FreeFile
    Dim sFile As String:    sFile = App.Path & "\Sample.exe"
    Dim b() As Byte:        ReDim b(FileLen(sFile))
    '
    Open sFile For Binary Access Read Lock Write As #nFile
    Get #nFile, , b
    Close #nFile
    '
    MsgBox UBound(b, 1)
    '
    sFile = App.Path & "\Sample1.exe"
    nFile = FreeFile
    '
    Open sFile For Binary Access Write Lock Read Write As #nFile
    Put #nFile, , b
    Close #nFile
Dmitrich

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 17:50

Dmitriy2003 писал(а):
Код: Выделить всё
    Dim b() As Byte:        ReDim b(FileLen(sFile))

off-by-one ;-)
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 06.01.2007 (Сб) 21:08

Dmitriy2003 Работает :D Спасибо!
И спасибо всем, кто помог мне :wink:

tyomitch
off-by-one
Вы о чем?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.01.2007 (Сб) 21:19

О том, что файл станет на один байт длиннее ;-)
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 06.01.2007 (Сб) 21:26

Поправляется так ReDim b(FileLen(sFile)-1) я полагаю? :wink:
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 97

    TopList