Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - в HEX записана png-картинка, её нужно перевести обратно в Byte Array и записать в png

Ответить
Настройки темы
VBS/WSH/JS - в HEX записана png-картинка, её нужно перевести обратно в Byte Array и записать в png

Новый участник


Сообщения: 16
Благодарности: 1


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте!
Помогите переписать скрипт с JS на VBS
Код: Выделить весь код
var outStreamW = new ActiveXObject("ADODB.Stream"); // Text stream in Unicode    charset
var outStreamA = new ActiveXObject("ADODB.Stream"); // Text stream in ISO-8859-1 charset
var binStr = '';

outStreamW.Type = 2;
outStreamW.Open();
                                 // couples of HEX values
outStreamW.WriteText( hex2text( '89504E470D0A1A0A0000000D4948445200000027000000420803000000E3443FEE0000000C504C5445F0EEEEF95353F59393' ) );
outStreamW.WriteText( hex2text( 'FF04047F58B0FF000000097048597300002E2300002E230178A53F760000014249444154789CED955902C42008434DB8FF9D' ) );
outStreamW.WriteText( hex2text( 'A7AD4BD9AC1C60FCAA363E10115AF38361251D404D27520242A40414290171EB0A409112F0F6AEE2E1C33A033BEA0C1CA413' ) );
outStreamW.WriteText( hex2text( '900374022ECE37900BF30D5494EBB380FB061AA7F6401AC41EE8CEB803D20176C007C76B1C8000D0930A5D4A208D35658D61' ) );
outStreamW.WriteText( hex2text( '9069D28A3821E6CC60FB5E1013A2B679AB7CB7749B026F1A7ADB74157362EE49B9417D1C1349172D636DAF83F1DE7EEB3889' ) );
outStreamW.WriteText( hex2text( 'F729E7B943EE7434B762CFA1269C81EBF74B1BC035E3B80215671DB267E14AABF523E6C57B46F3E315B6960BA16DC4B49E89' ) );
outStreamW.WriteText( hex2text( 'A4F3282F0BD4897F1A2C7606D43BC35F57D7857A1375CF0DF9C297E87A6AF9040B3A2E9DAF48C11134575A32DD0439A0D7AD' ) );
outStreamW.WriteText( hex2text( 'A70857846C00D4DF50349D4C55A45D5B31B2F104231269D95D2DA12F317D96ABBA0BDE5692B9A3EA847AF1794654544EBAE9' ) );
outStreamW.WriteText( hex2text( '5AC7F103F62B06FEC580AB3F0000000049454E44AE426082' ) );
outStreamW.Position = 0; //don't forget it or .Read will return 0 bytes

outStreamA.Type = 2;
outStreamA.Charset = 'ISO-8859-1'; // to avoid character conversion upper 127 ascii code
outStreamA.Open();
outStreamW.CopyTo( outStreamA ); // Copy unicoded stream to ISO-8859-1 stream
outStreamA.SaveToFile( 'test.png', 2 ); // save file as...

outStreamW.Close();
outStreamA.Close();

// converts couples of HEX values to a string of chars
function hex2text( inHexStr ){
  binStr = ''; //using global variable will be faster, I think.
  for ( i = 0; i < ( inHexStr.length / 2 ); i++ ){
      binStr += String.fromCharCode( '0x' + inHexStr.substr( i * 2, 2 ) );
      }
      return binStr;
  }
Смысл: в HEX записана png-картинка, её нужно перевести обратно в Byte Array и записать в файл test.png

Отправлено: 08:45, 05-05-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата semen77:
записана png-картинка, её нужно перевести обратно в Byte Array и записать в файл test.png »
Какова глобальная цель (зачем png-изображение)?

Во-первых, есть вариант гораздо проще: WSH: пример работы с бинарными данными через ADODB.Stream. Во-вторых, byte-array based не единственный способ хранения: vbscript: кодирование по алгоритму base64 (и ещё один способ что-то не найду).

А так: WSH: чтение и запись бинарных данных.

Отправлено: 13:42, 05-05-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


png - не панацея, просто взято в качестве образца.
Вот нашел вариант:
Код: Выделить весь код
' Convert Byte-Array to VBScript ANSI string (c)Paul Randall
Function ByteArray2String(bArr)
    Dim OriginalLocale
    OriginalLocale = SetLocale("en-us")
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .Write bArr
        .Position = 0
        .Type = 2 'adTypeText
        .Charset = "windows-1251"
        ByteArray2String = .Readtext
    End With
    SetLocale OriginalLocale
End Function

'Convert VBScript ANSI string to Byte-Array (c)Paul Randall
Function String2ByteArray(str)
    Dim OriginalLocale
    OriginalLocale = SetLocale("en-us")
    With CreateObject("ADODB.Stream")
        .Type = 2 'adTypeText
        .Charset = "windows-1251"
        .Open
        .WriteText str, 0
        .Position = 0
        .Type = 1 'adTypeBinary
        String2ByteArray = .Read
    End With
    SetLocale OriginalLocale
End Function

Function ReadBinaryFile(filename)
    Dim bArr
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .LoadFromFile filename
        bArr = .Read
        .Close
        ReadBinaryFile = bArr
    End With
End Function

Function SaveBinaryData(filename, byteArray)
    Const adSaveCreateOverWrite = 2
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .Write byteArray
        .SaveToFile filename, adSaveCreateOverWrite
        .Close
    End With
End Function

'============================================================
' Проверка
file = "input.jpg"
file_out = "output.jpg"

Dim file, file_out, Arr, strArr, strHex, x, i
' Читаем бинарный файл и преобразуем его в строку из hex значений
Arr = ReadBinaryFile(file)
strArr = ByteArray2String(Arr)
strHex = ""
For i = 1 To Len(strArr)
    x = Hex(Asc(Mid(strArr, i, 1)))
    If Len(x) < 2 Then x = "0" & x
    strHex = strHex + x
Next
WScript.Echo strHex

' Читаем строку из hex значений и записываем её в бинарный файл
strArr = ""
For i = 1 To Len(strHex) Step 2
    strArr = strArr & Chr("&H" & Mid(strHex, i, 2))
Next
Arr = String2ByteArray(strArr)
SaveBinaryData file_out, Arr
Но он безумно долгий (256кб картинка за 4 минуты - это полный цикл на core2duo)
Iska Смотрел ваши примеры, первый - на js, второй использует MSXml2.DOMDocument хотелось бы без него, пусть останется ADODB.Stream только.
P.S.: для сравнения пример в первом посте переводит ту же картинку (256кб/jpeg) HEX -> JPG за 4 секунды на том же core2duo. Устраивает всё за исключением языка реализации.
//Нужно VBS
Или если совсем просто, как переписать этот JS на VBS:
Код: Выделить весь код
// converts couples of HEX values to a string of chars
function hex2text( inHexStr ){
  binStr = ''; //using global variable will be faster, I think.
  for ( i = 0; i < ( inHexStr.length / 2 ); i++ ){
      binStr += String.fromCharCode( '0x' + inHexStr.substr( i * 2, 2 ) );
      }
      return binStr;
  }

Последний раз редактировалось semen77, 05-05-2013 в 14:28. Причина: tak-to

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:16, 05-05-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


semen77, Вы меня не поняли — глобальная Ваша цель какова?

Отправлено: 15:23, 05-05-2013 | #4


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Решить задачу: картинка в hex, hex в скрипте, скрипт в картинку.
//За сравнительно быстрое время.

Отправлено: 15:51, 05-05-2013 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата semen77:
для сравнения пример в первом посте переводит ту же картинку (256кб/jpeg) HEX -> JPG за 4 секунды на том же core2duo. »
Возьмите не 424 байта, а что-нибудь посерьёзнее. Порадуйтесь.


Код: Выделить весь код
Option Explicit

Const adTypeBinary = 1

Dim strString
Dim objUtilities

strString = _
	"89504E470D0A1A0A0000000D4948445200000027000000420803000000E3443FEE0000000C504C5445F0EEEEF95353F59393" & _
	"FF04047F58B0FF000000097048597300002E2300002E230178A53F760000014249444154789CED955902C42008434DB8FF9D" & _
	"A7AD4BD9AC1C60FCAA363E10115AF38361251D404D27520242A40414290171EB0A409112F0F6AEE2E1C33A033BEA0C1CA413" & _
	"900374022ECE37900BF30D5494EBB380FB061AA7F6401AC41EE8CEB803D20176C007C76B1C8000D0930A5D4A208D35658D61" & _
	"9069D28A3821E6CC60FB5E1013A2B679AB7CB7749B026F1A7ADB74157362EE49B9417D1C1349172D636DAF83F1DE7EEB3889" & _
	"F729E7B943EE7434B762CFA1269C81EBF74B1BC035E3B80215671DB267E14AABF523E6C57B46F3E315B6960BA16DC4B49E89" & _
	"A4F3282F0BD4897F1A2C7606D43BC35F57D7857A1375CF0DF9C297E87A6AF9040B3A2E9DAF48C11134575A32DD0439A0D7AD" & _
	"A70857846C00D4DF50349D4C55A45D5B31B2F104231269D95D2DA12F317D96ABBA0BDE5692B9A3EA847AF1794654544EBAE9" & _
	"5AC7F103F62B06FEC580AB3F0000000049454E44AE426082"

With WScript.CreateObject("ADODB.Stream")
	.Type = adTypeBinary
	.Open()
	
	Set objUtilities = WScript.CreateObject("CAPICOM.Utilities")
	
	.Write(objUtilities.BinaryStringToByteArray(objUtilities.HexToBinary(strString)))
	.SaveToFile("test2.png")
	
	Set objUtilities = Nothing
End With

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:22, 05-05-2013 | #6


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


CAPICOM.Utilities

Отправлено: 16:55, 05-05-2013 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


capicom download site:microsoft.com - Поиск в Google.

Отправлено: 20:00, 05-05-2013 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - в HEX записана png-картинка, её нужно перевести обратно в Byte Array и записать в png

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Проблема с отображением PNG rotten_inside Microsoft Windows 8 и 8.1 0 17-10-2012 07:12
Free PNG from any extractor 1.0 OSZone Software Новости программного обеспечения 0 03-04-2011 14:30
Иконки PNG и ICO sergeikom Microsoft Windows Vista 0 13-05-2007 12:52
upload .PNG on the server Ginger Вебмастеру 15 05-04-2005 23:56
В png формат Guest Программирование и базы данных 1 08-02-2004 17:16




 
Переход