Получение доступа к двоичному ответу побайтно в классическом asp / JScript - PullRequest
2 голосов
/ 05 мая 2010

Я задавал этот вопрос несколько дней назад, но, кажется, он довольно быстро остыл. То, что я хочу сделать, довольно просто, и я не могу поверить, что кто-то не понял этого.

Решение должно быть классическим JScript ASP. Я читаю файл с удаленного сервера и хочу обработать этот (двоичный) файл на моем сервере и выложить результаты обратно клиенту в виде XML.

Вот упрощенная версия того, что я пытаюсь сделать. Этот код запускается, или будет, если URL-адрес заполнен для вашего сайта. Этот тестовый файл - readbin.asp. Он читает файл с именем test.bin и записывает результат в поток. Я использовал поток, потому что это облегчает чтение файла и анализ содержимого. В основном я хочу:

while not end of stream
    read byte from stream
    process byte

вот readbin.asp:

<%@ LANGUAGE = JScript %>
<%
var url = "http:// (... your URL to the file test.bin goes here...) " ; 
var xmlhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP") ;
xmlhttp.open ("GET", url, false) ; 
xmlhttp.send () ; 

var BinaryInputStream = Server.CreateObject ("ADODB.Stream") ;
BinaryInputStream.Type = 1 ; // binary
BinaryInputStream.Open ;
BinaryInputStream.Write (xmlhttp.responseBody) ;
BinaryInputStream.Position = 0 ;

Response.Write ("BinaryInputStream.size = " + BinaryInputStream.size + "<br>") ;
Response.Write ("BinaryInputStream = " + BinaryInputStream + "<br>") ;

var ByteValue = BinaryInputStream.read (1) ;
Response.Write ("ByteValue = " + ByteValue + "<br>") ;
Response.Write ("typeof (ByteValue) = " + typeof (ByteValue) + "<br>") ;
%>

Моя проблема: как мне получить ByteValue как число 0..255? typeof (ByteValue) является "неизвестным".

Ord ?? Байт()?? Asc ?? Chr ??

Ответы [ 3 ]

0 голосов
/ 20 мая 2010

У меня гораздо больше опыта работы с vbscript, чем с jscript, но я сделаю это, так как не многие задаются этим вопросом.

утверждает, что есть шесть возможных значений, которые возвращает typeof: «число», «строка», «логическое значение», «объект», «функция» и «неопределенное». http://msdn.microsoft.com/en-us/library/259s7zc1(VS.85).aspx

Объект и метод ADODB.Stream .Read возвращают вариантный тип данных. Я подозреваю, что typeof не нравится вариант данных.
http://www.w3schools.com/ado/ado_ref_stream.asp

Публикация от этого парня, кажется, объясняет это немного дальше.
http://blogs.msdn.com/jaiprakash/archive/2007/01/09/jscript-supports-safearrays-of-variants-only.aspx

Я бы попробовал привести обратный поток перед применением typeof к нему.

0 голосов
/ 24 мая 2013

Может быть, не совсем по теме, но используя VBScript, я написал это:

option explicit
dim fso, wshSHell, objShellApp, args, stdin,stdout

set fso         = CreateObject("Scripting.FileSystemObject")
Set wshShell    = CreateObject("WScript.Shell")
set objShellApp = CreateObject("Shell.Application")
Set args = Wscript.Arguments
set stdin = wscript.stdin
set stdout = wscript.stdout

dim filename, txtFile

filename = args(0)

Const adTypeBinary = 1

'Create Stream object
Dim BinaryStream, data
Set BinaryStream = CreateObject("ADODB.Stream")

'Specify stream type - we want To get binary data.
BinaryStream.Type = adTypeBinary

'Open the stream
BinaryStream.Open

'Load the file data from disk To stream object
BinaryStream.LoadFromFile filename

'Open the stream And get binary data from the object
data = BinaryStream.Read
BinaryStream.close

dim i, item, strLine, hexLine
hexLine = ""
strLine = ""

stdout.writeline "Decimal |Hex     |Data                                             | ASCII 33-254"
for i = 0 to lenb(data)-1
  item = ascb(midb(data,i+1,1))
  if ((i MOD 16) = 0) and (i<>0) then
    stdout.writeLine right("00000000" & i,8) & "|" & right("00000000" & hex(i),8) & "|" &  hexLine & " | " & strLine
    hexLine = ""
    strLine = ""
  end if
  hexLine = hexLine & right("0" & hex(item),2) & " "
  if (item <= 32) or (item > 254) then 
    strLine=strLine + "."
  else
    strLine = strLine & chr(item)
  end if
next

Ключом к этому решению является знание того, что переменная 'data' содержит массив байтов. Вы можете справиться с этим, используя функцию lenb (длина байтового массива) и midb (чтобы извлечь один или несколько байтов).

Запустите скрипт следующим образом:

cscript dumphex.vbs my_binary_file.bin > my_binary_file.hex.txt

Это выведет к стандартному шестнадцатеричному коду всех данных двоичного файла. Каждая строка из 16 шестнадцатеричных кодов начинается с десятичного + шестнадцатеричного счетчика номера байта. Последний столбец отображает читаемую ASCII между 33 и 254.

Также здорово обойти тот раздражающий редактор, который интерпретирует ваши коды UTF-8, если вы хотите видеть только точные коды в ваших файлах ascii.

0 голосов
/ 09 мая 2010

Вы можете взглянуть на этот фрагмент кода: http://docs.hyperweb.no/source/asplib1.2/util/fileupload.asp

Этот код предназначен для обработки загруженных файлов. Это действительно очень похоже: - В строке 224 двоичный запрос считывается в объект потока. - В строке 232 данные считываются обратно как текст ISO-8859-1, что почти то, что вы хотите - Затем вы можете прочитать каждый байт этой строки, используя функцию getByte () в строке 48. Эта функция использует таблицу поиска в строке 33, чтобы исправить символы, которые преобразуются в юникод.

...