DXL конвертирует шестнадцатеричную строку в char - PullRequest
0 голосов
/ 16 октября 2019

Я анализирую OLE-объект в дверях. Представление смешивает символы ascii и objdata (шестнадцатеричное значение символов ASCII):

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
{\*\generator Riched20 10.0.17134}\viewkind4\uc1 
\pard\f0\fs20{\object\objemb{\*\objclass Package}\objw4620\objh810{\*\objdata 
01050000
02000000
08000000
5061636b61676500
00000000
00000000
d5c40000
02005f30306132636633392d323936612d346263612d396539342d383039343437336133343035

Я могу определить, где начинается мой файл, используя поля regex и objdata.

Поскольку мое расширение файлаis * .ole, я собираюсь искать строку ".ole" в начале поля objdata (длинная строка, начинающаяся с 0200) и обратно искать строку шестнадцатеричного кода 0200, которая.

Мой вопрос:

Как я могу преобразовать шестнадцатеричное представление обратно в ascii строку в DXL?

Существуют ли функции для выполнения этой задачи? простого броска будет достаточно? Или я напишу свою собственную функцию для выполнения этой задачи?

Я не смог найти ни одного намека на справочное руководство, также с радостью приветствовалось бы какое-нибудь ключевое слово или "страница RTFM".

KR

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Мне пришлось написать функцию с нуля, основываясь на ответе Майка и старой ветке на форумах IBM от пользователя Mathias Mamsch.

У меня много сомнений по поводу обработки буфера, но она отлично работает для моих целей:

Эта функция выполняет перевод строки Hex2ascii.

string Hex2Ascii(string &stringIn){
    Buffer buf = create
    string hexval
    while(length(stringIn)>0){
        hexval = iterateOnString(stringIn)
        //print(charOf(intOfHex))
        //print hexval
        //print charOf(intOfHex(hexval))
        buf += charOf(intOfHex(hexval))
        }
    return stringOf buf
}

Вызывает две другие функции;iterateOnString возвращает два символа для формирования преобразуемого байта и удаляет его из исходной строки:

string iterateOnString(string &stringIn){
    string StringOut
    int x = length(stringIn)
    if(x<2){
        return ""
        }
    StringOut = stringIn[0:1]
    stringIn = stringIn[2:]
    return StringOut
}

, затем intOfHex преобразует шестнадцатеричное значение в значение int, затем результат передается в charOf ()

int intOfHex( string s ) {
        if( "0x" == s[0:1] ) {
                return intOf( realOf( eval_ "return_ (" s ") \"\"" ) )
        } else {
                return intOf( realOf( eval_ "return_ (0x" s ") \"\"" ) )
        }
}

Любые советы, предложения по оптимизации или критика приветствуются.

KR

0 голосов
/ 17 октября 2019

Единственная известная мне поддержка, которая может вам помочь, это char charOf(int asciiCode) и int(char ch).

Мне не удалось обнаружить ".OLE" (2E 4F 4C 45) или ".ole"(2E 6F 6C 65) в строке, которую вы разместили, но при условии, что эти символы (или комбинация верхних и нижних символов) существуют, один из подходов состоит в том, чтобы пройти символ objdata для символа (используя буфер и целочисленную переменную)который зацикливается на каждом символе, что-то вроде int i = 0; int high; int low; Char c; while (...) { high = int(buf[i]); low = int(buf[i+1]); c = calculate_character_from_integers(high, low); i+=2; if c = ... then ...}, и при таком подходе, когда у вас есть новая строка, есть другая целочисленная переменная, которая указывает на начало строки, а когда у вас есть что-то вроде «текущий символ равен 45 или 65 ипредыдущий символ - это 4C или 6C, а предыдущий - 4F или 6F, а предыдущий - 2E, затем конкатенируйте имя файла в начале строки. «Не уверен, существуют ли какие-либо сценарии или фрагменты, которые помогаютздесь, возможно, вы найдете что-то на форумах IBM DeveloperWorks DXL (спешите, они прекратят свое существование через две недели)

...