我正在分析门中的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。
答案 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。