1

Тема: VBScript: Закодировать двоичные данные

Всем привет.
Нужнa помощь в создании скрипта который кодирует двоичные данные и пишет выход в файл
Описание:
Кодировать нужно четыре байта которые изначально подаются в HEX формате.
Изначально на входе имеются три байта в HEX. Назовем их B1,B2,B3. B1 никогда не меняется, B2 и B3 меняются от 00 до FF каждый. B4 - результат xor от B1,B2,B3. В итоге получаем входную последовательность B1,B2,B3,B4 которую нужно привести в двоичный формат и закодировать. При условии что  0 - это  "14 00" , а 1 - "37 00" в HEX .В принципе кодировать можно только  B2,B3,B4 так как B1 известен заранее , его значение  - A1 .
Можно-ли такое реализовать через VBScript ?
Спасибо.

2 (изменено: shiz, 2012-05-12 02:02:54)

Re: VBScript: Закодировать двоичные данные

-

Забыл пароль и потерял e-mail.

3

Re: VBScript: Закодировать двоичные данные

Алгоритм такой.
Когда будет известна последовательность для кодирования её нужно представить в двоичном виде и закодировать.
Например первые три байта A1 15 3D ,результат xor этих байт - 89. В итоге нужно закодировать 15 3D 89. В двоичном виде это будет:
00010101.00111101.10001001 - это и нужно кодировать. Условие что каждое значение уже предопределено 0 это байты 14 00, 1 - 37 00.
Именно эта последовательность в итоге будет выглядеть так: 14001400140037001400370014003700.14001400370037003700370014003700.37001400140014003700140014003700
Точками разделил ради наглядности. Еще уточню - это не текст а последовательность байт.

4

Re: VBScript: Закодировать двоичные данные

Должна получиться строка из нулей и единиц?

5

Re: VBScript: Закодировать двоичные данные

Александр_
Как я понял.

Дано:
Бит 0 кодируется как два байта 14 00
Бит 1 кодируется как два байта 37 00
Есть последовательность, состоящая из n битов.

Получить:
Каждый бит последовательности трансформировать в предопределенную двухбайтовую строку.

Результат:
Строка байт, где пары 14 00 и 37 00 четко идентифицируют каждый бит.

Может быть написано и витиевато, но переформулируя задачу мне легче ее понять.

2vv пишет:

Можно-ли такое реализовать через VBScript ?

Теоретически - можно. Но в VBS есть трудность в трансформации числа в битовое представление - по крайней мере нет такой же нативной функции, как Hex или Oct.

( 2 * b ) || ! ( 2 * b )

6

Re: VBScript: Закодировать двоичные данные

Примерно так, только оформить надо нормально:

x = InputBox("", "", "A1153D") 
str = ""
r = ""
for i=1 to Len(x) Step 6
   num1 = cInt("&H" & Mid(x, i, 2))
   num2 = cInt("&H" & Mid(x, i+2, 2))
   num3 = cInt("&H" & Mid(x, i+4, 2))
   num1 = num1 xor num2 xor num3
   for j=1 to 8
      if num2 and 1 then
	     str = "3700" & str
	  else
	     str = "1400" & str
	  end if
	  num2 = num2 \ 2
   next
   r = r & str
   str = ""
   for j=1 to 8
      if num3 and 1 then
	     str = "3700" & str
	  else
	     str = "1400" & str
	  end if
	  num3 = num3 \ 2
   next
   r = r & str
   str = ""
   for j=1 to 8
      if num1 and 1 then
	     str = "3700" & str
	  else
	     str = "1400" & str
	  end if
	  num1 = num1 \ 2
   next
   r = r & str
   str = ""
next 
MsgBox r

7 (изменено: 2vv, 2012-05-02 19:02:20)

Re: VBScript: Закодировать двоичные данные

Александр_ пишет:

Должна получиться строка из нулей и единиц?

На выходе должен получиться файл содержимое которого - последовательности типа "....37001400...." . Конечно в идеале было бы прогнать в цикле от A10000 до A1FFFF . И после кадого значение зяписывать его код. Просто дописывая файл.

Спасибо за ваш варинт, буду пробовать



Rumata пишет:

Теоретически - можно. Но в VBS есть трудность в трансформации числа в битовое представление - по крайней мере нет такой же нативной функции, как Hex или Oct.

Да, интересовался, в чистом видe функции нет. Но изловчиться можно.

8 (изменено: Александр_, 2012-05-02 20:36:41)

Re: VBScript: Закодировать двоичные данные

2vv пишет:

На выходе должен получиться файл содержимое которого - последовательности типа "....37001400...." . Конечно в идеале было бы прогнать в цикле от A10000 до A1FFFF . И после кадого значение зяписывать его код. Просто дописывая файл.

Ну файл и цикл вы уж как-нибудь сами организуйте. Вариант функции, не использующий дополнительную строку:

MsgBox f("A1153D")

Function f(x)
   num = array(cInt("&H" & Mid(x, 3, 2)), cInt("&H" & Mid(x, 5, 2)), cInt("&H" & Mid(x, 1, 2)))
   num(2) = num(0) xor num(1) xor num(2)
   str = ""
   for i=0 to 2
      num(i) = ((num(i) and 85)*2) or ((num(i)\2) and 85)
      num(i) = ((num(i) and 51)*4) or ((num(i)\4) and 51)
      num(i) = ((num(i) and 15)*16) or ((num(i)\16) and 15)
      for j=1 to 8
	     if num(i) and 1 then
            str = str & "3700"
         else
            str = str & "1400"
         end if
	     num(i) = num(i) \ 2
	  next
   next
   f = str
End Function

9 (изменено: 2vv, 2012-05-02 21:16:33)

Re: VBScript: Закодировать двоичные данные

Александр_
Протестил ваш скрипт. Что-то не то выходит.
Кодируемая последовательность - 153D89. Ваш скрит переводит эту последовательность как "000101010011110111111111" и это неверно. Проверил вручную, на калькуляторе выходит -  "101010011110110001001".
Я не совсем понимаю что делает эта часть кода?

 for j=1 to 8
      if num2 and 1 then
         str = "3700" & str
      else
         str = "1400" & str
      end if
      num2 = num2 \ 2
   next

10

Re: VBScript: Закодировать двоичные данные

2vv пишет:

Кодируемая последовательность - 153D89. Ваш скрит переводит эту последовательность как "000101010011110111111111" и это неверно.

Скрипт переводит в ту последовательность, которая указана в сообщении #3, откуда эта строка я не знаю.

2vv пишет:

Проверил вручную, на калькуляторе выходит -  "101010011110110001001".

Если добавить ведущие нули, то получится та строка, которую выдаёт скрипт.

2vv пишет:

Я не совсем понимаю что делает эта часть кода?

 for j=1 to 8
      if num2 and 1 then
         str = "3700" & str
      else
         str = "1400" & str
      end if
      num2 = num2 \ 2
   next

8 итераций(по числу бит в байте), num2 and 1 возвращает значение младшего бита(он же правый бит, эквивалентно num2 mod 2) и num2 = num2 \ 2 "отрезает" младший бит(младшим становится тот, который был вторым справа).

11

Re: VBScript: Закодировать двоичные данные

На форуме нашел такую замечательную функцию

Function Dec2Bin(n)
Do Until n = 0
    If (n Mod 2) Then Dec2Bin = "1" & Dec2Bin Else Dec2Bin = "0" & Dec2Bin
    n = n \ 2
Loop
End Function

Но есть одна проблема. Нас интересует все 8 бит. А эта функция не выводит старшие биты если в них 0. Например по числу 15 выход будет - 10101 , а нам нужен весь байт - 00010101.

12

Re: VBScript: Закодировать двоичные данные

2vv, добавьте к строке 8 нулей слева, затем отрежьте справа те же восемь символов.

13

Re: VBScript: Закодировать двоичные данные

alexii пишет:

2vv, добавьте к строке 8 нулей слева, затем отрежьте справа те же восемь символов.

Сорри, это как ?

14

Re: VBScript: Закодировать двоичные данные

2vv пишет:

это как ?

все-то вам разжевывать надо

Dec2Bin = Right("00000000" & Dec2Bin, 8)

Догадаетесь куда вставить?

( 2 * b ) || ! ( 2 * b )

15

Re: VBScript: Закодировать двоичные данные

Rumata

Спасибо.
Я не очень увлекаюсь скриптописанием. Редко что-то нужно. Поэтому и обращаюсь за помощью на форум к профи.

Насколько я понимаю вставить нужно в конец функции.

Function Dec2Bin(n)
Do Until n = 0
    If (n Mod 2) Then Dec2Bin = "1" & Dec2Bin Else Dec2Bin = "0" & Dec2Bin
    n = n \ 2
    Loop
    Dec2Bin = Right("00000000" & Dec2Bin, 8)
End Function

Буду собирать конечный вариант. Проблема будет в том как писать последовательность байт в файл...

16 (изменено: Rumata, 2012-05-03 15:42:23)

Re: VBScript: Закодировать двоичные данные

2vv пишет:

Насколько я понимаю вставить нужно в конец функции.

Все верно.

Только она здесь не нужна. Все делается циклом из примера коллеги Александр_

Александр_ пишет:

for j=1 to 8
...

Что из себя представляет задача? Ему есть реальное применение? Или это учебный материал?

( 2 * b ) || ! ( 2 * b )

17 (изменено: 2vv, 2012-05-04 15:35:53)

Re: VBScript: Закодировать двоичные данные

Что из себя представляет задача? Ему есть реальное применение? Или это учебный материал?

Да, это для реального применения. Есть одна идея. От одного девайса был утерян пульт ДУ. Пульт ДУ можно собрать на микроконтроллере. Но вот прошивать его надо зная коды кнопок. Есть софт который может генерировать пакеты для ДУ и собирать прошивку для контроллера. Настройки пульта(коды) хранятся в файле, формат известен. Вот я хочу скриптом создать файл с кодами и опробовтаь их. Рабочие комбинации пойдут в прошивку. Диапазон довольно большой, вручную набирать слишком накладно. Так как от программирования довольно далек решил попробовать реализовать на VBScript, с которым иногда сталкиваюсь.

18

Re: VBScript: Закодировать двоичные данные

for i=0 to 65535
   msgbox f("A1" & DecToHex(i))
next

Function GetHexDigit(x)
   if x<10 then
      GetHexDigit = cStr(x)
   else
      GetHexDigit = Chr(Asc("A")+x-10)
   end if
End Function

Function DecToHex(ByVal x)
   dim i
   DecToHex = ""
   for i=1 to 4
      DecToHex = GetHexDigit(x mod 16) & DecToHex
	  x = x \ 16
   next
End Function

Function f(x)
   dim i, j, str, num
   num = array(cInt("&H" & Mid(x, 3, 2)), cInt("&H" & Mid(x, 5, 2)), cInt("&H" & Mid(x, 1, 2)))
   num(2) = num(0) xor num(1) xor num(2)
   str = ""
   for i=0 to 2
      num(i) = ((num(i) and 85)*2) or ((num(i)\2) and 85)
      num(i) = ((num(i) and 51)*4) or ((num(i)\4) and 51)
      num(i) = ((num(i) and 15)*16) or ((num(i)\16) and 15)
      for j=1 to 8
         if num(i) and 1 then
            str = str & "3700"
         else
            str = str & "1400"
         end if
         num(i) = num(i) \ 2
      next
   next
   f = str
End Function

Осталось только в файл записать.

19

Re: VBScript: Закодировать двоичные данные

Спасибо.
Как записать в тектовый файл я осилил. Но дело в том что текстовый файл не совсем подходит, так как 37 00 и 14 00 - это байты. Как в VBScript писать в файл байты - не нашел. Можно потом HEX редактором воспользоваться, но это не то.

20

Re: VBScript: Закодировать двоичные данные

2vv пишет:

Спасибо.
Как записать в тектовый файл я осилил. Но дело в том что текстовый файл не совсем подходит, так как 37 00 и 14 00 - это байты. Как в VBScript писать в файл байты - не нашел. Можно потом HEX редактором воспользоваться, но это не то.

функция chr() возвращает символ с указанным ascii кодом. Т.е. str = str & chr(37) & chr(00) вместо str = str & "3700".

21

Re: VBScript: Закодировать двоичные данные

Тогда так:
str = str & chr(55) & chr(00)
вместо - str & chr(37) & chr(00)
Буду тестировать. Спасибо, не догадался что так можно.