Coldfusion PHP';我们冷冰冰地打开包装

Coldfusion PHP';我们冷冰冰地打开包装,coldfusion,cfml,unpack,Coldfusion,Cfml,Unpack,我需要将这个php函数转换为一个api的coldfusion函数,我运气不太好。我对php或类似的coldfusion解包不太熟悉,只是遇到了麻烦 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/vo

我需要将这个php函数转换为一个api的coldfusion函数,我运气不太好。我对php或类似的coldfusion解包不太熟悉,只是遇到了麻烦

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

我不是PHP爱好者,但我的理解是
unpack('C*',…)
应该转换为使用ascii编码解码字符串,即
charsetDecode(字符串,“us ascii”)

返回错误“无法将值4.294967296E9转换为 整数,因为它不能放入整数中

不幸的是,CF的右侧需要一个32位整数。值4294967296超过。您需要使用。函数返回一个BigDecimal。在表达式的前半部分使用它:

  firstPart = precisionEvaluate((37 * h + p));
然后使用以下方法获得模量:

  h = firstPart.remainder( javacast("bigdecimal", 4294967296) );
最后,返回结果:

   precisionEvaluate(h - 2147483648)

可能是重复的你能发布你到目前为止尝试过的吗?因为写下来,这个问题很可能会被关闭或太宽。我在我的原始问题@LeighThanks@Leigh中添加了一些代码。这正是我所需要的。我走了大十进制的道路,但没有意识到除数也必须是大十进制。我也是una再次感谢。我感谢你抽出时间。对于那些只想把这两项工作都解包的人。
charsetDecode(字符串,ascii)和toBinary(toBase64(字符串))
很高兴我能帮上忙:)关于precisionEvaluate有一件事要记住:您必须始终使用它来维护BigDecimal。只要您对该函数之外的BigDecimal变量应用数学运算,例如
h=h*1
,而不是
h=precisionEvaluate(h*1)
,CF将转换为“h”“返回到
java.lang.Double
。啊,一种(相对)无类型语言的乐趣;-)哎呀,我刚注意到一个打字错误。编码应为-而不是“ascii”。答案已更新。@PHP pack/unpack函数最好添加到CFLib(或github)。我经常看到没有任何CF代码示例或第三方库的项目,但它们会有使用此PHP特定函数的PHP示例。@JamesMoberg我不确定上面示例中的1对1等效值是否值得一提,除非该函数包含格式参数。那太酷了。在这种情况下,事实证明我更关心大十进制问题,而不是解包。