CFML InputBaseN 未返回预期值

CFML InputBaseN not returning expected value

当使用 Adob​​e ColdFusion 并尝试将十六进制字符串转换为十进制时,我们似乎没有得到我们的结果 wanting/expecting。

<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

我猜你用的是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

雷洛 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

露西 5:https://trycf.com/gist/f73bd8fbe652f5c5675c658d5cd356f3/lucee5?theme=monokai

只是为了扩展 ... Traditionally, most (though not all) CF numeric functions were limited to 32 bit signed integers. CF 2016 changed that by having inputBaseN() return a 64 bit integer, or Long. Most of the workarounds mentioned in the bug reports are trying to do the opposite of what you need (replicate the old behavior under CF2016). To replicate the new behavior under CF10/11, try using 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);

对于 CF 服务器 运行 Java8,从技术上讲,您还可以对生成的整数调用 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

这是旧的。最近完成一些遗留工作后,我不得不重构一些 window.atob on the client side and ran into this (on the server). The CF parsing issue also fails with extra spaces. I used trim:

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