当使用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
答案 0 :(得分:4)
我的猜测是你在使用CF10或11?这似乎是在CF2016中修复的那些版本中的错误,但在10/11中会破坏向后兼容性。
https://tracker.adobe.com/#/view/CF-3712098
https://tracker.adobe.com/#/view/CF-4175842
这些错误日志确实包含可能适合您的解决方法。
我能够验证行为。
-1593835440
CF10:https://trycf.com/gist/ab0e93b1d690401778a57b443ff42a3e/acf?theme=monokai
CF11:https://trycf.com/gist/45db48930b2cfbeec600d6d840521470/acf11?theme=monokai
Railo 4.2:https://trycf.com/gist/dee04bec7b7983bfd97dac69ea3bc930/railo?theme=monokai
Lucee 4.5:https://trycf.com/gist/31497d2b3a35ed69e9c95081ea5bd83d/lucee?theme=monokai
2701131856
CF2016:https://trycf.com/gist/73b81b7184f47275503ab57d5ee5eeaa/acf2016?theme=monokai
Lucee 5:https://trycf.com/gist/f73bd8fbe652f5c5675c658d5cd356f3/lucee5?theme=monokai
答案 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 );
答案 2 :(得分:0)
这是旧的。在最近进行了一些遗留工作之后,我不得不在客户端重构一些 window.atob 并遇到了这个问题(在服务器上)。 CF 解析问题也会因额外的空格而失败。我使用了trim:
<cfset strBase64Value = ToString( ToBase64( trim(myvalue) ) ) />