Войти

Показать полную графическую версию : в HEX записана png-картинка, её нужно перевести обратно в Byte Array и записать в png


semen77
05-05-2013, 08:45
Здравствуйте!
Помогите переписать скрипт с 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( '89504E470D0A1A0A0000000D4948445200000027000000420803000000E3443FEE0000000C504C5445F0EEEEF95353F5939 3' ) );
outStreamW.WriteText( hex2text( 'FF04047F58B0FF000000097048597300002E2300002E230178A53F760000014249444154789CED955902C42008434DB8FF9 D' ) );
outStreamW.WriteText( hex2text( 'A7AD4BD9AC1C60FCAA363E10115AF38361251D404D27520242A40414290171EB0A409112F0F6AEE2E1C33A033BEA0C1CA41 3' ) );
outStreamW.WriteText( hex2text( '900374022ECE37900BF30D5494EBB380FB061AA7F6401AC41EE8CEB803D20176C007C76B1C8000D0930A5D4A208D35658D6 1' ) );
outStreamW.WriteText( hex2text( '9069D28A3821E6CC60FB5E1013A2B679AB7CB7749B026F1A7ADB74157362EE49B9417D1C1349172D636DAF83F1DE7EEB388 9' ) );
outStreamW.WriteText( hex2text( 'F729E7B943EE7434B762CFA1269C81EBF74B1BC035E3B80215671DB267E14AABF523E6C57B46F3E315B6960BA16DC4B49E8 9' ) );
outStreamW.WriteText( hex2text( 'A4F3282F0BD4897F1A2C7606D43BC35F57D7857A1375CF0DF9C297E87A6AF9040B3A2E9DAF48C11134575A32DD0439A0D7A D' ) );
outStreamW.WriteText( hex2text( 'A70857846C00D4DF50349D4C55A45D5B31B2F104231269D95D2DA12F317D96ABBA0BDE5692B9A3EA847AF1794654544EBAE 9' ) );
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

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

Во-первых, есть вариант гораздо проще: WSH: пример работы с бинарными данными через ADODB.Stream (http://forum.script-coding.com/viewtopic.php?id=238). Во-вторых, byte-array based не единственный способ хранения: VBScript: кодирование по алгоритму base64 (http://forum.script-coding.com/viewtopic.php?id=2848) (и ещё один способ что-то не найду).

А так: WSH: чтение и запись бинарных данных (http://forum.script-coding.com/viewtopic.php?id=1226).

semen77
05-05-2013, 14:16
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;
}

Iska
05-05-2013, 15:23
semen77, Вы меня не поняли — глобальная Ваша цель какова?

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

Iska
05-05-2013, 16:22
для сравнения пример в первом посте переводит ту же картинку (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

semen77
05-05-2013, 16:55
:( CAPICOM.Utilities

Iska
05-05-2013, 20:00
capicom download site:microsoft.com - Поиск в Google (https://www.google.ru/search?q=CAPICOM+download+site%3Amicrosoft.com).




© OSzone.net 2001-2012