CFML InputBaseN未返回预期值

时间:2018-01-31 16:15:19

标签: coldfusion cfml

当使用Adobe ColdFusion并尝试将十六进制字符串转换为十进制时,我们似乎无法获得我们想要/期望的结果。

<cfset i = #InputBaseN("A1000050", 16)# >
<cfdump var="#i#">

输出-1593835440 我们期待2701131856

在Windows计算器中,当我们将A1000050转换为dec qword时,它会给出我们预期的结果。但是,如果我们使用dword,它会给我们ColdFusion提供的保存值。

在ColdFusion中,我们做错了什么?我们怎样才能得到预期值?

期望值的二进制(根据Windows calc程序员模式)

0000 0000 0000 0000 0000 0000 0000 0000
1010 0001 0000 0000 0000 0000 0101 0000

= 2701131856

我们实际得到的二进制值

1010 0001 0000 0000 0000 0000 0101 0000

= -1593835440

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

仅扩展Shawn's answer that it is a bug ...传统上,大多数(尽管不是全部)CF数字函数仅限于32位签名整数。 CF 2016通过让inputBaseN()返回64位整数或Long来改变它。错误报告中提到的大多数解决方法都试图与您需要的相反(复制CF2016中的旧行为)。要复制CF10 / 11下的新行为,请尝试使用Long.parseLong()代替:

// Option 1. Using javacast. Returns 2701131856
value = javacast("long", 0).parseLong("A1000050", 16);

// Option 2. Using createObject. Returns 2701131856
value = createObject("java", "java.lang.Long").parseLong("A1000050", 16);

对于运行Java8的CF服务器,从技术上讲,你也可以在生成的Integer上调用toUnsignedLong(),但是......它很脆弱。仅适用于CF10 / 11和Java8 +。

// ONLY works under CF10/11 and Java8+. Returns -2701131856 
origValue = InputBaseN(input, 16);
newValue = origValue .toUnsignedLong(origValue );

Example on trycf.com

答案 2 :(得分:0)

这是旧的。在最近进行了一些遗留工作之后,我不得不在客户端重构一些 window.atob 并遇到了这个问题(在服务器上)。 CF 解析问题也会因额外的空格而失败。我使用了trim

<cfset strBase64Value = ToString( ToBase64( trim(myvalue) ) ) />