Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: www.vk-book.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 24.12.06 20:56
bt(0) = lng and &HFF&
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-сайт: hw.t-k.ru
 Профиль | | #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++

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам