Страница: 1 |
Страница: 1 |
Вопрос: Как побайтно прочитать содержание переменной Long?
Добавлено: 24.12.06 15:36
Автор вопроса: Tur | ICQ: 201446364
Вот два вопроса:
1. Я в vb6. Например в переменной типа Long есть число. Как увидеть содержимое первого байта, второго итд? Можно было бы записать этот Long в бинарный файл, а затем прочитать его по-байтно. Можно также написать или взять функцию переводящую этот Long в побитный стринг(32 char-а), разделить этот стринг на четыре по 8 чаров и обратить эти четыре в байты. Но все это очень медленно. Есть ли более простой способ?
2. Есть ли редакторы файлов в которых видно их по-битное содержание (не по-байтное, а по-битное, т.е. нули и единицы) ?
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
Djon
Вопросов: 61
Ответов: 471
Web-сайт:
Профиль | | #1
Добавлено: 24.12.06 16:27
Ответ на вопрос №2 попробуй прогу Restorator.
И вообще таких прог много.
Номер ответа: 2
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #2
Добавлено: 24.12.06 17:21
Djon, спасибо. Инсталлировал Restorator, но он файлы мои не открывает ((
Поясняю первый вопрос:
подобно тому как переменной байт можно читать бинарный файл как читать побайтно содержание переменной?
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 24.12.06 20:56
bt(1) = (lng and &HFF00& / &HFF&
bt(2) = (lng and &HFF0000& / &HFF00&
bt(3) = (lng and &HFF000000& / &HFF0000&
вроде бы должно работать
можно не долго думая сделать еще так:
CopyMemory(bt, lng, 1)
Номер ответа: 4
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #4
Добавлено: 24.12.06 22:27
sne, спасибо!
только вот у меня не всегда это работает, т.е. может быть ошибка и у меня, это трудно проверить. Для некоторых чисел твой код работает верно, т.е. как мой с разбивкой на стринги, а вот напр для числа 2108234567 твой код выдает bt(0)=71 bt(1)=27 bt(2)=170 bt(3)=125, а у меня получается bt(2)=169 . Для числа 1308734504 у тебя bt(1)=181, а у меня bt(1)=180
А можно эти bt(0)- bt(3) как то соединить все вместе и отнестись к ним как к одному лонгу и т.о. проверить это?
На самом деле я вообще почти ничего в твоем коде не понял, ну это уж мои проблемы, с памятью я никогда не работал. А можешь в двух словах сказать что это такое &HFF& или объяснить одну строчку bt(0) = lng and &HFF& ? В любом случае большое спасибо тебе!
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 24.12.06 22:35
&HFF& - число
какое? - msgbox val("&HFF"
что такое and ? - логическое сложение
101
110 and
===
100
CopyMemory - API для копирования памяти. Подробнее - гуглить.
CopyMemory (куда, откуда, размер)
Номер ответа: 6
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #6
Добавлено: 25.12.06 00:55
HACKER, большое спасибо! Очень вы со sne меня порадовали!
Столько раз я пользовался and итд но ни разу т.о.
Наверное я зануда, но почему именно эти числа(и почему деление):
bt(1) = (lng And &HFF00& / &HFF& ?
т.е. bt(1) = (lng And 65280) / 255 ? Ведь при делении округление до целого может происходить с ошибкой. Вопрос остается: как объединить эти bt(0)-bt(3) так чтобы увидеть и прочитать в них лонг?
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 25.12.06 03:11
используй тогда целочисленное деление "\"
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 25.12.06 10:34
ИМХО, проще и нагляднее использовать UDT и LSet.
Номер ответа: 9
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #9
Добавлено: 25.12.06 12:05
sne, а почему целочисленное и вообще деление? Я ведь вроде бы простые вещи спашиваю: как твой код добирается до отдельных байтов? Как это ему удается? Я просто не знаю весь этот механизм, как это все устроено.
LamerOnLine, ты не мог бы пояснить как использовать в данном случае UDT и LSet? Будь добр приведи пример, а то у меня вместо наглядности один туман.
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 25.12.06 12:36
Option Explicit
Private Type LongVar
LongNumber As Long
End Type
Private Type ByteVar
ByteNumber(3) As Byte
End Type
Private Sub Form_Load()
Dim LongNum As LongVar
Dim ByteNum As ByteVar
LongNum.LongNumber = 2108234567
LSet ByteNum = LongNum
End Sub
И никаких АПИ
ЗЫ Обратное преобразование также справедливо.
Номер ответа: 11
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #11
Добавлено: 25.12.06 14:17
LamerOnLine, с ума сойти! Я знал, что все гениальное просто!
Но обратно то как?
LSet strLongNum = ByteNum - это не работает
Я чувствую себя инвалидом.
Номер ответа: 12
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #12
Добавлено: 25.12.06 14:25
Понял, стыжусь
Dim LongNum2 As LongVar
LSet LongNum2 = ByteNum
Номер ответа: 13
Автор ответа:
Tur
ICQ: 201446364
Вопросов: 22
Ответов: 72
Профиль | | #13
Добавлено: 25.12.06 14:30
Спасибо всем! Все работает! Много ли нужно человеку для полного счастья?
Номер ответа: 14
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #14
Добавлено: 25.12.06 14:55
Молодец. Осталось суметь убедить врачей - отмаза от армии обеспечена
А вот не сумеешь - узнаешь )
ЗЫ posts++