Binary мать его........

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

Binary мать его........

Сообщение --=GAMER=-- » 30.11.2004 (Вт) 12:11

Как закодировать значение переменной (например х=36893)в бинарное значени (например 000111101100101010) ?
Далее записать в файл...
А потом достать и раскодировать?

Спасибо за ответы.
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 30.11.2004 (Вт) 13:04

1. Перевести число в бинарную систему:
Код: Выделить всё
Public Function DexToBin(ByVal num As Long) As String
  If num = 0 Then DexToBin = "0": Exit Function
  Dim i As Long
 
  For i = 0 To num
    If 2 ^ i > num Then Exit For
    DexToBin = IIf(num And 2 ^ i, "1", "0") + DexToBin
  Next
 
  If Len(DexToBin) = 0 Then Bin = "0"
End Function

2. Записать в файл:
Код: Выделить всё
sub writetofile(fname as string, dat as string)
dim x as integer
x=freefile
open fname for append as x
print #x, dat
close x
end sub

3. Прочитать из файла:
Код: Выделить всё
function readfromfile(fname as string) as string
dim x as integer
x=freefile
Open fname For Input As x
    readfromfile = Input(LOF(x), 1)
Close x
end function

4. Перевести число в десятичную систему:
Код: Выделить всё
Public Function BinToDex(Bin As String) As Long
Dim i As Long
For i = 1 To Len(Bin)
BinToDex = BinToDex + CLng(Mid$(Bin, i, 1)) * 2 ^ (Len(Bin) - i)
Next i
End Function

5. Как использовать:
Код вставь в модуль формы, напиши в любом событии:
Код: Выделить всё
dim chislo as long 'Закодировано
dim chislo2 as string 'раскодировано
chislo = .....
writetofile "c:\file.txt", dextobin(chislo)
chislo2=readfromfile("c:\file.txt")
msgbox trim(bintodex(chislo2))

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 01.12.2004 (Ср) 5:49

А если переменная несёт в себе буквы?
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

DragonTriste
Обычный пользователь
Обычный пользователь
 
Сообщения: 76
Зарегистрирован: 15.08.2004 (Вс) 10:46

Сообщение DragonTriste » 01.12.2004 (Ср) 7:13

откуда в числах буквы ? :shock:

если ты текстовую переменую в бинарную... можно взять код каждой (asc) и потом перевести в бинарную... только не понятно зачем вообще столько мороки с бинарниками
dragons on line...

Zer
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 460
Зарегистрирован: 26.09.2003 (Пт) 13:08
Откуда: Нижний Новгород

Сообщение Zer » 01.12.2004 (Ср) 22:21

На мой взгляд так лучше:
Код: Выделить всё
Binary$=""
For i=1 to 32
    c=Number mod 2
    Number=Number\2
    Binary$=str$(c) & Binary$
Next i

Number-исходное число(естественно не более FFFFFFFFh)
Binary$-стринговая перем. с бинарной формой числа
Microsoft DirectX - Маломягкий Прямой Х...
Не откладывай на завтра то, что можно выпить сегодня...

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 02.12.2004 (Чт) 7:11

А если переменных несколько то всё прийдётся повторять снова и снова?
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 02.12.2004 (Чт) 21:17

А не проще файл открыть for binary?

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 02.12.2004 (Чт) 21:17

А не проще файл открыть for binary?
Или цель именно в получении из числа ноликов и единичек?
Можно по-подробнее, для чего это нужно?

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 02.12.2004 (Чт) 21:42

Ariman писал(а):А не проще файл открыть for binary?
Или цель именно в получении из числа ноликов и единичек?
Можно по-подробнее, для чего это нужно?


это по ходу хитроумный способ кодирования информации )))
ХЎ

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 02.12.2004 (Чт) 21:56

d3drm: гыгыгы
Я знаю верный путь

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 03.12.2004 (Пт) 6:56

А нужно это мне для защиты данных которые записывает моя программа .....
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 03.12.2004 (Пт) 7:07

Ariman - а как так через Binary?
Код: Выделить всё
Open "Binary.txt" For Binary As #1

но для опереатора write "это плохой режим файла"(ошибка)....
А как тогда читать переменные я вообще не понимаю....
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.12.2004 (Пт) 11:13

юзай put
ХЎ

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 03.12.2004 (Пт) 13:05

Ну-ну, про "хитроумный способ" я не говорю. Неужели присутствующие здесь считают, что я не знаю, что такое бинарные файлы?
Просто в начале GAMER не сообщил, что ему конкретно нужно, и по его словам выходило, будто бы ему надо записать данные в бинарном виде.
Теперь вопрос к GAMER'у:
"Для защиты данных" - что имеется в виду? Если ты просто хочешь записать некоторые данные(например, из игры) в файл так, чтобы при открытии его блокнотом нельзя было вручную поменять 100$ на 10000$, то это в самый раз. И лучше всего в этой ситуации делать так:
Допустим, у тебе надо сохранить, скажем, количество ХП у игрока, количество маны и золота. Делаем тип PlayerData:

Код: Выделить всё
Type PlayerData
Hits as integer
Mana as integer
Gold as long
end type

Dim pd as PlayerData
'далее открываем файл для записи в бинарной форме:
open "save1.sve" for binary as #1
put #1,,pd
close #1

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 03.12.2004 (Пт) 13:09

А если считываешь, то тоже самое, только:

Код: Выделить всё
Type PlayerData
Hits as integer
Mana as integer
Gold as long
end type
Dim pd as PlayerData

open "save1.sve" for binary as #1
get #1,,pd
close #1


Вот так.
А если тебе нужна реальная защита данных, то этим уж точно не обойтись :D
Но это уже отдельная тема. Если по-проще, можно, скажем, каждую букву текста ксорить каким нибудь числом.
А можно не постоянным числом, а, скажем, кодом следующей буквы.
Последнюю ксорить кодом первой, а дальше- первая xor вторая и т.д. Тоже вполне неплохо.

Sergey-13
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 119
Зарегистрирован: 23.01.2004 (Пт) 16:02
Откуда: Саранск

Сообщение Sergey-13 » 03.12.2004 (Пт) 14:22

данные ты куда пишешь - в тхт?
если хочеш сильно заморочиться то могу предложить сделать так
1. сначало пишешь бинарный файл.
проюзай put, get
2. Потом переписываешь его как захочешь, например вычитай какое нибудь значение типа int(now), потом будешь смотреть дату изменения файла и де кодировать

Sergey-13
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 119
Зарегистрирован: 23.01.2004 (Пт) 16:02
Откуда: Саранск

Сообщение Sergey-13 » 03.12.2004 (Пт) 14:23

данные ты куда пишешь - в тхт?
если хочеш сильно заморочиться то могу предложить сделать так
1. сначало пишешь бинарный файл.
проюзай put, get
2. Потом переписываешь его как захочешь, например вычитай какое нибудь значение типа int(now), потом будешь смотреть дату изменения файла и де кодировать

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 03.12.2004 (Пт) 14:24

Ariman как раз это подойдёт!!
Достаточно просто и действенно!
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 03.12.2004 (Пт) 14:25

Sergey-13
Подумаю над этим.
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

Sergey-13
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 119
Зарегистрирован: 23.01.2004 (Пт) 16:02
Откуда: Саранск

Сообщение Sergey-13 » 03.12.2004 (Пт) 14:48

Ariman

Код:
Type PlayerData
Hits as integer
Mana as integer
Gold as long
end type
Dim pd as PlayerData

open "save1.sve" for binary as #1
get #1,,pd
close #1

[u]если я не ошибаюсь, то обязательно нужно[/u]

Sergey-13
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 119
Зарегистрирован: 23.01.2004 (Пт) 16:02
Откуда: Саранск

Сообщение Sergey-13 » 03.12.2004 (Пт) 14:50

Ariman

Код:
Type PlayerData
Hits as integer
Mana as integer
Gold as long
end type
Dim pd as PlayerData

open "save1.sve" for binary as #1
get #1,,pd
close #1
Обязательно нужно
Dim pd As Byte

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 03.12.2004 (Пт) 16:39

Прошу прощения, но ты ошибаешься.
Это, кажется, называется "типизированый файл"...
Кинь на форму кнопку и проверь следующий код:


Код: Выделить всё
Private Type test
val1 As Integer
val2 As String
val3 As Long
val4 As Double
End Type
Dim t As test
Dim t2 As test
Private Sub Command1_Click()
Open "test.tst" For Binary As #1
Get #1, , t2
Close #1
Debug.Print t2.val1, t2.val2, t2.val3, t2.val4,
End Sub

Private Sub Form_Load()
t.val1 = 100
t.val2 = "Hello"
t.val3 = 100000000
t.val4 = 5.5
Open "test.tst" For Binary As #1
Put #1, , t
Close #1

End Sub

Sergey-13
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 119
Зарегистрирован: 23.01.2004 (Пт) 16:02
Откуда: Саранск

Сообщение Sergey-13 » 06.12.2004 (Пн) 9:58

Может я не точно выразился.
Работать то буде, и в файл что то запишеться
Я столкнулся с этим при перезаписи wav и mid файлов
Если переменная не определена как Byte, то файл переписывается но затем не проигрывается, хотя данные по всем адресам полностью совпадают, с чем это связанно я так и не разобрался.
да и не слишком долго парился.
Как будет в этом случае я не знаю

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 06.12.2004 (Пн) 21:28

Ну уж это ты дал. Списывать свои ошибки на неправильность этого метода. Я им пользовался постоянно и в 100% случаев все работало.
Кстати, почему когда я спрашивал про запись в MID ты не ответил, что знаешь об этом что-либо :? :? :?
Пришлось самому разбираться. Правда, разобрался, теперь нормально в MID записываю, все работает.........

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 06.12.2004 (Пн) 21:31

Ты в MIDI-то правильно записываешь?? Там ведь в variable-lenght записывается delta-time, а не просто так.........

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 07.12.2004 (Вт) 10:45

Ariman писал(а):Ты в MIDI-то правильно записываешь?? Там ведь в variable-lenght записывается delta-time, а не просто так.........
О! Я и обытом хотел узнать!
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 07.12.2004 (Вт) 10:46

В смысле как в midi записывать.... Обьясните пожалуйста
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 07.12.2004 (Вт) 13:43

Могу кинуть ссылку на очень хорошую страничку, именно благодаря ней я и научился. Кода там почти нет, но теория - замечетльная.


http://www.borg.com/~jglatt/tech/midifile.htm

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 07.12.2004 (Вт) 13:52

--=GAMER=--, а ты хорошо с побитовыми операциями знаком?
Скажем, знаешь, что получится в результате следующей операции:
Код: Выделить всё
debug.print 44763 and &hff


Просто там очень много подобных вещей, нужно из DWORD'ов выделять HIWORD'ы и LOWWORD'ы, и т.д.
В записи, правда, этого по-меньше, это в основном при считывании нужно, а при записи необходимо будет WORD'ы и DWORD'ы переводить из LittleEndian в BigEndian, меняя порядок следования байтов............

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.12.2004 (Вт) 14:07

Есть
Код: Выделить всё
44763 and &hff

а есть
Код: Выделить всё
44763& and &hff&

.

Но удобнее обращаться с частями DWORD с помощью API; там есть специальные функции, выделяющие HI и LOW части.
Lasciate ogni speranza, voi ch'entrate.

След.

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

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

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

    TopList