dil: (Default)
dil ([personal profile] dil) wrote2007-05-06 06:46 pm
Entry tags:

Квест для любителей серверных решений компании micro$oft

Дано: IIS 5 с ASP (JScript и VBScript, по желанию)

Этап первый: попробуйте прочитать бинарный файл. Например, картинку в формате JPG

Что, таки получилось?

Тогда этап второй: попробуйте из этого файла выделить байты, скажем, с 10 по 20. И напечатать дамп.


А те, кто придумал эти чисто клиентские языки использовать в качестве серверных, заслуживают медленной и мучительной смерти. За мои сильно испорченные нервы.

[identity profile] b-a-t.livejournal.com 2007-05-06 06:30 pm (UTC)(link)
А что, в VBScript пропали все конструкции basic'a по работе с бинарными данными? Помнится, во времена моей молодости Питер Нортон в своей книжки давал кусочки кода именно на васике...

[identity profile] dil.livejournal.com 2007-05-06 06:46 pm (UTC)(link)
А ты Visual Basic с VBScript'ом не путай. Это похожие, но разные вещи.

[identity profile] dkfl.livejournal.com 2007-05-06 07:14 pm (UTC)(link)
вроде как perlScript раньше был, но не уверен, что этот проект еще поддерживается.

[identity profile] dil.livejournal.com 2007-05-06 07:31 pm (UTC)(link)
Он не является стандартным средством ASP. Можно туда и PHP прикрутить, но это выходит за поставленные рамки задачи.
Они обусловлены тем, что уже имеется система, реализованная на JScript'е, а к ней надо добавить маленькую дополнительную функциональность.

[identity profile] webushka.livejournal.com 2007-05-06 08:09 pm (UTC)(link)
С такими вопросами надо к [livejournal.com profile] kippie обращаться. Он же "Win The Web" Evangelist в MS. Хорошая работа у человека - людям по ушам ездить, как решения мелкомягких улучшают всё.

[identity profile] dil.livejournal.com 2007-05-06 08:27 pm (UTC)(link)
Подозреваю, что ответ в стиле MS будет "а нафига вам это старье, пользуйтесь ASP.NET - там с этим все в порядке".
И оно действительно так. Только вот менять платформу ради одного нововведения как-то не хочется.

[identity profile] max-gashkov.livejournal.com 2007-05-07 06:15 am (UTC)(link)
Ну так для старья решения ищутся за 5 минут в гугле, разве нет? Зачем нервы-то себе портить?

[identity profile] dil.livejournal.com 2007-05-07 09:46 am (UTC)(link)
А вы нашли? Тогда расскажите, мне интересно.

[identity profile] max-gashkov.livejournal.com 2007-05-07 10:03 am (UTC)(link)
«Официальная» рекомендация (http://support.microsoft.com/kb/193998) от MS.
Еще один вариант (http://www.motobit.com/tips/detpg_read-write-binary-files/).

Второй, насколько я понимаю, должен достаточно легко позволять сделать ч. 2. Проверить, увы, не могу, всю жизнь писал под LAMP, ставить IIS сейчас откровенно нет желания :) Мимо поста не смог пройти, т.к. не верю, что настолько популярная платформа не позволяет решать настолько тривиальные проблемы.

[identity profile] dil.livejournal.com 2007-05-07 10:31 am (UTC)(link)
Поздравляю. Вы прошли первую часть квеста.

Проблема в том, что объект, полученный в результате такого чтения, пригоден для записи куда-нибудь (в другой ADODB.Stream или Response) только целиком.
Осталась вторая часть - как получить оттуда отдельные байты.

Хинт: в результате выполнения операции BinaryStream.Read возвращается вовсе не массив байтов, и не строка, а неопределенный объект с еще менее определенными методами.
Попытка применить к нему оператор new String() заканчивается неудачей из-за несовместимости типов.

Про то, что и прочитать можно только весь файл целиком, а он может быть довольно большим, я уже не говорю.

[identity profile] max-gashkov.livejournal.com 2007-05-07 10:54 am (UTC)(link)
Мда, признаю. А скомпилировать ActiveX-объект ну совсем-совсем никак?

[identity profile] dil.livejournal.com 2007-05-07 11:05 am (UTC)(link)
Который?

Наверное, можно, если задаться такой целью. Но это ж надо искать компилятор, где-то разворачивать его, собирать DLL. А сервер чужой, и я на него попадаю исключительно через rdesktop.
Я видел готовые модули, но они почему-то за деньги.
Вот такая печальная история.

Мозг не сектым.

[identity profile] k-g-b.livejournal.com 2007-05-07 12:05 pm (UTC)(link)
Блин, Саш - http://www.asp101.com/articles/jacob/scriptupload.asp
Там описан скрипт Upload. Он тоже не весь поток в файл пишет. Дальше догадаешься?

Re: Мозг не сектым.

[identity profile] dil.livejournal.com 2007-05-07 12:33 pm (UTC)(link)
Прочитал, но не догадался. Там используется
biData = Request.BinaryRead(Request.TotalBytes)
после чего из этого biData непонятным мне образом извлекаются данные.

У меня из ADODB.Stream методом Read возвращается непонятный объект, из которого данные нормальным способом извлечь не получается.

Re: Мозг не сектым.

[identity profile] k-g-b.livejournal.com 2007-05-08 01:00 pm (UTC)(link)
"У меня из ADODB.Stream методом Read возвращается непонятный объект,..."
TypeName() для чего придумали? ;-)

Эххх молодешшшшьььь ....

[identity profile] k-g-b.livejournal.com 2007-05-08 01:39 pm (UTC)(link)
Это выдача шестнадцатеричного дампа. Разберешься? :-) :
Rem ======================================================
sFileName = "MyGif.gif"
iFrom     = 10
iLen      = 15

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Set oFso = CreateObject("Scripting.FileSystemObject")

Set oBinFile = oFso.OpenTextFile( sFileName, ForReading)

oBinFile.Skip( iFrom )

MyBinBlock = oBinFile.Read( iLen )

oBinFile.Close

Convert = ""

for i = 1 to iLen

    Convert = Convert & Right( "0" & Hex(Asc(Mid(MyBinBlock,i,1))) & " ", 3)

next

WScript.Echo Convert

Re: Эххх молодешшшшьььь ....

[identity profile] dil.livejournal.com 2007-05-08 02:31 pm (UTC)(link)
Ты уверен, что это работает для _бинарных_ файлов? Ты правда пробовал запустить этот код?

FileSystemObject provides a non-hierarchical structure to manipulate, read, and create ASCII and Unicode text files. This structure is very different from the hierarchical structure of the original implementation of File I/O in Visual Basic. FileSystemObject does not support binary file access, so you must still use the original File I/O model in Visual Basic for binary file access. (http://support.microsoft.com/kb/186118/)

The FSO model, contained in the Scripting type library (Scrrun.dll), supports the creation and manipulation of text files through the TextStream object; however, the FSO model does not support binary files. To manipulate binary files, use the FileOpen Function with the Binary keyword. (http://msdn2.microsoft.com/en-us/library/aa711216(vs.71).aspx) Указанная функция присуствует в VB, но не в VBScript'е.

Ну и на закуску: http://blogs.msdn.com/ericlippert/archive/2005/04/20/410127.aspx

Re: Эххх молодешшшшьььь ....

[identity profile] k-g-b.livejournal.com 2007-05-08 04:04 pm (UTC)(link)
Ой-ой-ой. Наберут пионероффф ...
Саш не морочь голову. Тебе говорят, что в японской локали E0 будет периравнено к 00. Ну наф её - японскую локаль, то? Setlocale, а как с файлом позабавился, можешь, ради чистоты, вернуть обратно. Не, ну если хочется гемороиться с дополнительными объектами - НЕТ ПРЕГРАДЫ ПАТРИОТАМ!

Re: Эххх молодешшшшьььь ....

[identity profile] k-g-b.livejournal.com 2007-05-08 04:06 pm (UTC)(link)
А да. Не полностью ответил. Саш - запускал и проверял. Специально прочитать символы возврата каретки, 00 и из верхней части таблицы.

Re: Эххх молодешшшшьььь ....

[identity profile] dil.livejournal.com 2007-05-08 04:09 pm (UTC)(link)
чисто на всякий случай - 0x84 нормально читается?
А то мне до вечера проверить не на чем

Re: Эххх молодешшшшьььь ....

[identity profile] k-g-b.livejournal.com 2007-05-08 04:31 pm (UTC)(link)
Чисто по приколу, ебал я в рот эти таблички несмотря на предупреждение "DO NOT DO THIS" из последней твоей ссылки сделал bin фалик :
' DO NOT DO THIS
Set FSO=CreateObject("Scripting.FileSystemObject") 
Set File=FSO.CreateTextFile("test.bin", True)
For i = 0 to 255
  File.Write Chr(i) 
Next
File.Close

создал файлик и просмотрел его ГЛАЗАМИ. ВЕСЬ.

По твоей просьбе проставил в программу :
sFileName = "test.bin"
iFrom     = &H8
iLen      = 8

и получил на выходе :
80 81 82 83 84 85 86 87


P.S. И удовлетворенный пошел домой :-)

P.P.S. На всякий случай :
WScript.Echo GetLocale
Возвращает 1049
:-)))))

Re: Мозг не сектым.

[identity profile] k-g-b.livejournal.com 2007-05-08 01:41 pm (UTC)(link)
Жаль что кострукция "for each" не работает для Strings :-)

Re: Мозг не сектым.

[identity profile] k-g-b.livejournal.com 2007-05-08 01:50 pm (UTC)(link)
Можно еще по байтику читать :
Rem ======================================================
sFileName = "MyGif.gif"
iFrom     = 10
iLen      = 15

Const ForReading = 1, ForWriting = 2, ForAppending = 8

Set oFso = CreateObject("Scripting.FileSystemObject")

Set oBinFile = oFso.OpenTextFile( sFileName, ForReading)

oBinFile.Skip( iFrom )

Convert = ""

for i = 1 to iLen

    Convert = Convert & Right( "0" & Hex(Asc(oBinFile.Read(1))) & " ", 3)

next

WScript.Echo Convert

oBinFile.Close