Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Подсчет размера DHT секции JPEG файла (http://forum.oszone.net/showthread.php?t=233707)

pzh2393 29-04-2012 01:00 1907589

Подсчет размера DHT секции JPEG файла
 
Доброй ночи!
Помогите, пожалуйста, в написании VBS скрипта подсчитывающего колиество байт DHT секции (Таблицы Хаффмана) JPEG файла.
т.е. необходимо в стуктуре JPEG файла найти тэг "FF C4" и посчитать количество байт до следующей секции (обычно SOS "Начало Сканирования" = "FF DA").

Дополнительно прошу сделать условие, что если размер секции не превышает 200 байт выводить скажем параметр "А", а если превышает 300 - тогда "В". Значения находящиеся в промежутке меня пока не интересуют.

Пы.Сы. Как и в прошлый раз (http://forum.oszone.net/post-1810917.html) это необходимо для подключения скрипта к Тотал Коммандеру и ввода значений в колонки для сортировки.

El Sanchez 03-05-2012 18:36 1909982

pzh2393,
Код:

Path =  "c:\temp\Chicken.JPG"

Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = 1
BinaryStream.Open
BinaryStream.LoadFromFile Path
BinaryFile = BinaryStream.Read
For i = 1 To LenB(BinaryFile)
        If AscB(MidB(BinaryFile, i, 1)) < 16 Then S = S & "0" & Hex(AscB(MidB(BinaryFile, i, 1))) Else S = S & Hex(AscB(MidB(BinaryFile, i, 1)))
Next
DHT = (InStr(S, "FFDA")-InStr(S, "FFC4"))/2-2
If DHT <= 200 Then WScript.Echo "A"
If DHT >= 300 Then WScript.Echo "B"
BinaryStream.Close


pzh2393 03-05-2012 22:40 1910124

Спасибо! буду пробовать прикрутить к чему мне необходимо..

Iska 03-05-2012 23:49 1910182

El Sanchez, я пробовал данный подход, и даже не стал выкладывать, поскольку не годится, ибо дико медленно. pzh2393, для данного случая Вам WSH не подойдёт — ну, нет у него вменяемых средств для подобной работы. Лучше попросите о том же в соседней ветке: Программирование, если Вам подойдёт исполняемый файл.

El Sanchez 04-05-2012 21:55 1910696

Цитата:

Цитата Iska
поскольку не годится, ибо дико медленно »

Iska, да уж, тормоз еще тот. Каюсь, тестировал на файле маленького размера.
pzh2393, предлагаю вариант №2, побыстрее:
Код:

sPath = "c:\temp\e.jpg"
nChunkSize = 1024

Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = 1
BinaryStream.Open
BinaryStream.LoadFromFile sPath

Do While InStr(sRes, "FFDA") = 0
        BinaryFile = Empty
        BinaryFile = BinaryStream.Read(nChunkSize)       
        For i = 1 To nChunkSize
                sRes = sRes & Right("00" & Hex(AscB(MidB(BinaryFile, i, 1))), 2)
        Next
        If InStr(sRes, "FFDA") > 0 Then
                sHuffSection = Mid(sRes, InStr(sRes, "FFC4"), InStr(sRes, "FFDA")-InStr(sRes, "FFC4"))
                Do While InStr(sHuffSection, "FFC4") > 0
                        nDHTsz = nDHTsz + CInt("&H" & Mid(sHuffSection, 5, 4))
                        sHuffSection = Right(sHuffSection, Len(sHuffSection)-CInt("&H" & Mid(sHuffSection, 5, 4))*2-4)
                Loop
        End If
Loop

If nDHTsz <= 200 Then WScript.Echo "A"
If nDHTsz >= 300 Then WScript.Echo "B"

BinaryStream.Close


pzh2393 04-05-2012 21:56 1910697

Может всетаки получится, если упростим условие?
Выяснилось, что следующие два байта после тэга "FF C4" указывают на размер секции DHT в 16-ричном виде...
Можно сделать поиск НЕХ значения "FF C4" перевод следующих за этим двух байт в 10-ричное значение и в зависимости от размера выдача результата?

2 El Sanchez Премного благодарен!
Видимо писал предыдущее сообщение в одно время с вами...
Сейчас проверил - срабатывает именно так, как необходимо!

Iska 04-05-2012 23:00 1910736

Цитата:

Цитата pzh2393
Выяснилось, что следующие два байта после тэга "FF C4" указывают на размер секции DHT в 16-ричном виде... »

Просите коллегу El Sanchez'а, чтобы сделал; будет отрабатывать ещё шустрее.

El Sanchez 05-05-2012 11:35 1910913


Цитата:

Цитата pzh2393
Выяснилось, что следующие два байта после тэга "FF C4" указывают на размер секции DHT в 16-ричном виде...
Можно сделать поиск НЕХ значения "FF C4" перевод следующих за этим двух байт в 10-ричное значение и в зависимости от размера выдача результата? »

pzh2393, так оно и реализовано. Из объектной переменной BinaryStream, содержащей весь файл, в переменную BinaryFile считывается порция данных размером nChunkSize и переводится в промежуточный строковый буфер sRes до тех пор, пока sRes не будет содержать в себе маркер SOS (FFDA). Из буфера вычленяется секция DHT (разница между вхождением в sRes значения FFDA и первого вхождения маркера DHT (FFCA)) и присваивается переменной sHuffSection. Далее работа идет с этой переменной. В цикле ищутся все вхождения FFCA (таблиц может быть несколько), берутся 4 символа (2 байта) после маркера, переводятся в число, результат добавляется к nDHTsz - общему числу байт, переменная sHuffSection уменьшается на длину маркера и длину данных и далее обрабатывается в цикле, пока есть вхождения FFCA.


Время: 15:16.

Время: 15:16.
© OSzone.net 2001-