PHP在Coldfusion中解压缩

时间:2016-04-05 20:52:40

标签: coldfusion cfml unpack

我需要将这个php函数转换为api的coldfusion函数,我没有太多运气。我不熟悉php或coldfusion unpack等效的东西,只是打了一堵砖墙。

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

最终结果应为i32hash('127.0.0.1:1935/vod/sample.mp4')= 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;
}    

感谢您的帮助。

@Leigh在下面的评论中提供了更新的答案

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);
}

1 个答案:

答案 0 :(得分:3)

我不是一个PHP人,但我的理解是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) );

最后,返回结果:

   precisionEvaluate(h - 2147483648)