2015-10-06 92 views
1

这是我的问题。在PHP中,有两个函数在ColdFusion中难以复制。ColdFusion相当于PHP解压和SHA1

1)PHP的解压功能,让您格式化以一定的方式输出。其中一种格式选项是'H',代表“Hex字符串,首先是高半字节” - 我如何在ColdFusion中复制它?

这是我迄今为止...

<cfscript> 
function stringToBinary(String stringValue){ 
    var base64Value = toBase64(stringValue); 
    var binaryValue = toBinary(base64Value); 
    return(binaryValue); 
} 

function stringToHex(String stringValue){ 
    var binaryValue = stringToBinary(stringValue); 
    var hexValue = binaryEncode(binaryValue, "hex"); 
    return(lcase(hexValue)); 
} 
</cfscript> 

所以我想不出来指定在上述(实现高字节也是,我没有写此ColdFusion这是奔礼貌纳德尔)。

其次,在PHP中有一个用于散列的SHA1函数...该函数有一个参数,它是一个布尔参数“如果可选raw_output设置为TRUE,则sha1摘要返回原始二进制格式长度为20,否则返回值为40个字符的十六进制数字。“所以我的Coldfusion模仿这只是简单地使用Hash()函数并指定它使用“SHA-1”,然后将其转换为二进制文件......但是如何正确地将它限制为“20”,方式与PHP完全相同呢?

我知道这是参与由我已经难倒了一段时间,现在就这两个问题...任何帮助是非常赞赏。

回答

5

使用哈希()函数和 指定它使用“SHA-1”,然后是转换成二进制...但 我会怎样正确限制为“20”

你不需要做任何事情。 SHA1 produces 160 bits。二进制结果将始终为20个字节,或编码为hexadecimal(每字节两个字符)的40个字符。

hashString = hash("Something wicked this way comes", "sha1"); 
    hashBinary = binaryDecode(hashString, "hex"); 
    writeOutput(" String/len("& len(hashString) &")"); 
    writeOutput(" Binary/arrayLen("& arrayLen(hashBinary) &")"); 

“H”代表“的十六进制字符串,高半字节先” 弄清楚在执行指定上述

高四位有没有你认为你必须做一个具体的理由什么特别的/额外的?从我读过的,用于在PHP中生成十六进制的典型函数,即bin2hex,首先默认为高半字节,就像CF一样。除了CF将结果转换为大写的事实之外,结果是相同的。你能提供一个PHP和CF结果不同的具体例子吗?

PHP:

echo bin2hex("Green Onions"); 
// result: 477265656e204f6e696f6e73 

CF

writeDump(binaryEncode(charsetDecode("Green Onions", "utf-8"), "hex")); 
// result: 477265656E204F6E696F6E73 
+0

这是伟大的信息!我非常欣赏这个回应。实际上我有一件事要澄清,我没有在我原来的帖子中说过......解包格式实际上是“H *”而不是“H” - 任何想法? –

+0

(编辑)我不是一个PHP的人,但[包文档](http://php.net/manual/en/function.pack.php)说*意味着“...重复输入的结尾数据”。听起来像是将它应用到整个输入字符串,而不仅仅是它的一部分。这就是二进制编码/解码无论如何默认做的。再说一次,听起来你不得不做任何事情。除非您有一个具体的PHP代码示例,其行为与CF不同。 – Leigh

+0

@BradMash - 关于[你的(现在删除的)线程](http://stackoverflow.com/questions/37468449/weird-cfloop-file-behavior),很高兴你找到了解决方案,但请记住S.O.线程被存档以使所有人受益:)与其删除线程,不如将解决方案作为答案发布,以便其他人也可以从中受益。 – Leigh