BustedSanta Asked: 2020-11-20 17:44:35 +0800 CST2020-11-20 17:44:35 +0800 CST 2020-11-20 17:44:35 +0800 CST 通过 Oracle SQL 将原始值或十六进制值转换为有符号 2 的补码 772 有没有办法通过 Oracle SQL 将 HEX 或 RAW 值转换为有符号 2 的补码? 例子: 十六进制:8508 > 十进制:34046 > 十进制从有符号 2 的补码:-31480 我试图在我的 SQL 语句中得到的数字是 -31480。 oracle plsql 1 个回答 Voted Best Answer Jim D 2020-11-20T19:34:43+08:002020-11-20T19:34:43+08:00 使用表达式 result = -(x & mask) + (x & !mask) 其中 mask=2^(n-1) 产生您想要的结果。(x & mask) 隔离符号位, (x & !mask) 是偏移量。当符号位未设置时, (x & mask) == 0 并且 (x & !mask) 是结果。当符号位被设置时,-(x & mask) == -2^(n-1) 和 (x & !mask) 是最负数的偏移量。 接下来,我们使用 HEXTORAW() 将十六进制字符串转换为原始表示。使用 UTL_RAW.CAST_TO_BINARY_INTEGER() 将原始表示转换为整数。 假设 16 位: 选择 X, -BITAND(utl_raw.cast_to_binary_integer(hextoraw(x)),32768) +BITAND(utl_raw.cast_to_binary_integer(hextoraw(x)),32767) 从(从双重选择'8508'x); DB Fiddle 示例 注意:您可能希望执行一次 utl_raw.cast_to_binary_integer(hextoraw(...)) 而不是两次。
使用表达式
其中 mask=2^(n-1) 产生您想要的结果。(x & mask) 隔离符号位, (x & !mask) 是偏移量。当符号位未设置时, (x & mask) == 0 并且 (x & !mask) 是结果。当符号位被设置时,-(x & mask) == -2^(n-1) 和 (x & !mask) 是最负数的偏移量。
接下来,我们使用 HEXTORAW() 将十六进制字符串转换为原始表示。使用 UTL_RAW.CAST_TO_BINARY_INTEGER() 将原始表示转换为整数。
假设 16 位:
DB Fiddle 示例
注意:您可能希望执行一次 utl_raw.cast_to_binary_integer(hextoraw(...)) 而不是两次。