ColdFusion相当于PHP Unpack和SHA1

时间:2015-10-06 19:29:59

标签: php coldfusion

这是我的问题。在PHP中有两个函数,我很难在ColdFusion中复制。

1)PHP的解包功能,让您以给定的方式格式化输出。其中一种格式选项是' H'代表"十六进制字符串,高半字节优先" - 我怎么能在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>

所以我不能指出在上面的实现中指定高半字节(同样,我没有写这个冷却,这是由Ben Nadel提供的)。

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

我知道这涉及到我在这两个问题上已经被困了很长时间......非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

  

使用Hash()函数和   指定它使用&#34; SHA-1&#34;然后将其转换为二进制...但是   我将如何正确地限制它&#34;到20&#34;

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

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

&#39; H&#39;代表&#34;十六进制字符串,高半字节优先&#34;   想出在上面的实现中指定高半字节

您是否认为必须做一些特殊/额外的事情?根据我的阅读,用于在PHP中生成十六进制的典型函数,即bin2hex,默认为高半字节,CF也是如此。除了CF将结果转换为大写的事实之外,结果是相同的。您能否提供PHP和CF结果不同的具体示例?

<强> PHP:

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

<强> CF

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