2015-10-06 71 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