CFML InputBaseN 未返回预期值
CFML InputBaseN not returning expected value
当使用 Adobe 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 );
这是旧的。最近完成一些遗留工作后,我不得不重构一些 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) ) ) />
当使用 Adobe 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
只是为了扩展 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 );
这是旧的。最近完成一些遗留工作后,我不得不重构一些 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) ) ) />