PHP 在 Coldfusion 中解压
PHP's unpack in Coldfusion
我需要将此 php 函数转换为 api 的冷融合函数,但我运气不佳。我对 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
这是我一直在使用的代码,但它不起作用。我收到 "Cannot convert the value 4.294967296E9 to an integer because it cannot fit inside an integer." 的错误返回,这发生在模数处。
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(theString, "us-ascii")
.
I get an error back of "Cannot convert the value 4.294967296E9 to an
integer because it cannot fit inside an integer.
不幸的是,CF 的 modulus operator, requires a 32 bit integer on the right side. The value 4294967296 exceeds the maximum allowed for integers. You will need to use a BigDecimal instead. The PrecisionEvaluate() 函数 return 是一个 BigDecimal。在表达式的前半部分使用它:
firstPart = precisionEvaluate((37 * h + p));
然后使用BigDecimal.remainder()方法获取模数:
h = firstPart.remainder( javacast("bigdecimal", 4294967296) );
最后,return结果:
precisionEvaluate(h - 2147483648)
我需要将此 php 函数转换为 api 的冷融合函数,但我运气不佳。我对 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
这是我一直在使用的代码,但它不起作用。我收到 "Cannot convert the value 4.294967296E9 to an integer because it cannot fit inside an integer." 的错误返回,这发生在模数处。
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(theString, "us-ascii")
.
I get an error back of "Cannot convert the value 4.294967296E9 to an integer because it cannot fit inside an integer.
不幸的是,CF 的 modulus operator, requires a 32 bit integer on the right side. The value 4294967296 exceeds the maximum allowed for integers. You will need to use a BigDecimal instead. The PrecisionEvaluate() 函数 return 是一个 BigDecimal。在表达式的前半部分使用它:
firstPart = precisionEvaluate((37 * h + p));
然后使用BigDecimal.remainder()方法获取模数:
h = firstPart.remainder( javacast("bigdecimal", 4294967296) );
最后,return结果:
precisionEvaluate(h - 2147483648)