DXL将十六进制字符串转换为char

时间:2019-10-16 11:58:41

标签: hex ibm-doors

我正在分析门中的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字段检测文件的起始位置。

由于文件扩展名为* .ole,因此我将在objdata字段(长行以0200开头)的开头搜索“ .ole”字符串,然后向后搜索该字符串的0200十六进制字符串。

我的问题是:

如何在DXL中将十六进制表示形式转换回ascii字符串?

是否有执行此任务的功能?一个简单的演员就足够了吗?还是我应该编写自己的函数来执行此任务?

我在参考手册上找不到任何提示,也欢迎一些关键字或“ RTFM页面”。

K.R。

2 个答案:

答案 0 :(得分:0)

我所知道的唯一可能对您有帮助的支持是char charOf(int asciiCode)int(char ch)

我无法在您发布的行中发现“ .OLE”(2E 4F 4C 45)或“ .ole”(2E 6F 6C 65),但是假设这些字符(或上下字符的组合)字符)存在,一种方法是遍历字符的objdata字符(使用Buffer和一个整数变量,该变量遍历每个字符,类似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论坛中找到了一些东西(很快,它们将在两周后消失)

答案 1 :(得分:0)

我不得不根据Mike的回复和用户Mathias Mamsch的{​​{3}}从头开始编写一个函数。

我对缓冲区处理有很多疑问,但是对于我的目的来说,它工作得很好:

此函数执行字符串的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 ") \"\"" ) )
        }
}

欢迎任何提示,优化建议或批评家。

K.R。