2016-04-05 4 views
1

私はこのAPI関数をAPIのcoldfusion関数に変換する必要があります。私は大したことはありません。私は十分に精通していないphpやcoldfusionのアンパック同等物とちょうどレンガの壁に当たった。PHPがColdfusionでアンパック

function i32hash($str) { 
$h = 0; 
foreach (unpack('C*', $str) as &$p) { $h = (37 * $h + $p) % 4294967296; } 
return ($h - 2147483648); 
} 

最終結果は(「127.0.0.1:1935/vod/sample.mp4」)i32hashする必要があります= 565817233

が、これは私が取り組んできたが、そのが動作していないコードです。私は「4.294967296E9の値を整数に変換できないため、整数に変換できません」というエラーが戻ってきます。これはモジュラスで起こります。

function i32hash(str) { 
    var h = 0; 

    // php unpack equivalent 
    str = toBinary(toBase64(str)); 

    for(p in str) { 
     h = (37 * h + p) % 4294967296; 
    } 

    return h-2147483648; 
}  

ありがとうございました。

更新答え、私は、PHPの男ではないよ

function i32hash(str) { 
    var h = 0; 
    var strArray = charsetDecode(arguments.str, "us-ascii"); 

    for(var p in strArray) { 
     h = precisionEvaluate((37 * h + p)); 
     h = h.remainder(javacast("bigdecimal", 4294967296)); 
    } 

    return precisionEvaluate(h - 2147483648); 
} 
+0

可能な重複を。 com/questions/32978130/coldfusion-equivalent-to-php-unpack-and-sha1) –

+0

これまでに試したことを投稿できますか?書かれているように、この質問は[トピック外](http://stackoverflow.com/help/on-topic)またはあまりにも幅広く閉鎖される可能性が高いためです。 – Leigh

+0

オリジナルの質問にいくつかのコードを追加しました@Leigh – renhack

答えて

3

下のコメントで@Leighから供給されたが、私の理解では、unpack('C*',..) ASCIIエンコーディング、すなわちを使用して文字列をデコードするために翻訳しなければならないということですcharsetDecode(theString, "us-ascii")

私は戻って、それは整数に収まることができないので、「 整数に値4.294967296E9を変換できませんのエラーを取得します。

残念ながら、CFのmodulus operatorは、右側の32ビット整数が必要です。。。サイド値4294967296はmaximum allowed for integersを超えてあなたが代わりにBigDecimalを使用する必要がありますPrecisionEvaluate()機能はBigDecimalのを返す式の前半にそれを使用します。

firstPart = precisionEvaluate((37 * h + p)); 

そして代わりBigDecimal.remainder()方法を用いて弾性率を得る:最後

h = firstPart.remainder(javacast("bigdecimal", 4294967296)); 

、結果を返す:// stackoverflowの:[PHPアンパックおよびSHA1へのColdFusion等価](HTTPの

precisionEvaluate(h - 2147483648) 
+0

ありがとう@Leigh。それはまさに私が必要としたものでした。私はbigDecimalのパスを下ったが、除数もbigDecimalでなければならないことに気付かなかった。私はまた、precisionEvaluateが存在していたことに気づいていませんでした。 ;) 再度、感謝します。私はあなたの時間を感謝します。 これらの作業の両方をアンパックしたいだけの方に。 'charsetDecode(theString、" ascii ")&toBinary(toBase64(theString))' – renhack

+0

私は助けてもらえました:) precisionEvaluateについて覚えておいていただきたいことは、BigDecimalを維持するために一貫して使用する必要があります。 'h = precisionEvaluate(h * 1)'の代わりに 'h = h * 1'のような、その関数の外にあるBigDecimal変数*に対して数学演算を適用すると、CFは" h "を' java.lang.Double'。ああ、(比較的)タイプレス言語の喜び;-) – Leigh

+0

おっと、ちょっとタイプミスがありました。エンコーディングは "ascii"ではなく、[us-ascii](http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html)にする必要があります。回答が更新されました。 – Leigh

関連する問題