首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP在Coldfusion中的解压缩

PHP在Coldfusion中的解压缩
EN

Stack Overflow用户
提问于 2016-04-05 20:52:40
回答 1查看 204关注 0票数 1

我需要将这个php函数转换为一个api的coldfusion函数,而且我没有多少运气。我不太熟悉php或coldfusion的解压缩等价物,只是碰上了一块砖墙。

代码语言:javascript
运行
复制
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转换为整数,因为它不能适应一个整数”。这发生在模数上。

代码语言:javascript
运行
复制
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在下面的评论中提供

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 22:44:26

我不是一个PHP家伙,但我的理解是,unpack('C*',..)应该转换为使用ascii编码,即charsetDecode(theString, "us-ascii")解码字符串。

我得到一个错误返回“不能将值4.294967296E9转换为整数,因为它不能适应一个整数。

不幸的是,CF的模算子在右侧需要一个32位整数。值4294967296超过整数允许的最大值。您将需要使用BigDecimal代替。PrecisionEvaluate()函数返回一个BigDecimal。在表达式的前半部分使用它:

代码语言:javascript
运行
复制
  firstPart = precisionEvaluate((37 * h + p));

然后使用BigDecimal.remainder()方法获得模数:

代码语言:javascript
运行
复制
  h = firstPart.remainder( javacast("bigdecimal", 4294967296) );

最后,返回结果:

代码语言:javascript
运行
复制
   precisionEvaluate(h - 2147483648)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36436828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档