您显示的值是有符号整数,而 HexToNumber() 返回无符号整数。
你还需要指定基数,例如
a = HexToNumber("bea000000004080b",Base(16));
为了解决有符号整数问题,可以使用如下公式:
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
但是,您又会遇到另一个问题,即 JMP 无法精确呈现 64 位整数值。最后两位数字将被截断并具有随机值。我建议将您的 64 位值拆分为高 32 位值和低 32 位值,并将这些值存储在两个单独的列中。如下所示:
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
请参阅附件的数据表示例。
这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。
我会为此使用 python。好消息是 JMP18 可以直接在 JMP 中运行 python 脚本。这将是执行您想要的操作的 python 脚本:
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
至于为什么 JMP 的精度限制为 17 位,那是因为 JMP 使用 float64 来表示数值。要获得超过 17 位的精度,JMP 需要使用 float128 来重新编译数值,从而导致其使用更多的系统内存。如果这很重要,您可以将其作为功能请求提交。您可以在此处执行此操作:https: //community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。
@dadawasozo什么时间太多了(您有超过 40 000 000 * 100 行数据)?如果您必须快速转换这些数据,您可能需要发挥一点创造力(与此没有直接关系,但阅读“十亿行挑战”很有趣, https://github.com/gunnarmorling/1brc,您还可以从谷歌找到其他语言的解决方案,YouTube 上也有视频展示和解释一些解决方案)。
@mzwald当你回到 JMP 时,除了转换为字符串之外,还有其他方法可以避免出现“OverflowError: Python int too large to convert to C long”吗?拆分值?
Names Default To Here(1);
hex_to_signed_int_str = function({h},
Python Execute({h}, {x},
"\[import binascii
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
x = int.from_bytes(ba, byteorder='big', signed=True)
#x = str(x)
]\");
return(x);
);
signed_int_str = hex_to_signed_int_str("bea000000004080b");
show(signed_int_str);
这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。
这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。