我的组件被传递了一个很长的值,我后来将其用作缓存中的密钥.密钥本身是长值的字符串表示,就好像它是无符号的64位值.也就是说,当我的组件被交给-2944827264075010823L时,我需要将其转换为字符串键"15501916809634540793".
我有一个解决方案,但它似乎蛮力,它让我有点不安.本质上,我将long转换为十六进制字符串表示形式(所以-2944827264075010823L变为"d721df34a7ec6cf9")并将十六进制字符串转换为BigInteger:
String longValueAsHexString = convertLongToHexString(longValue); BigInteger bi = new BigInteger(longValueAsHexString, 16); String longValueString = bi.toString();
然后我使用longValueString作为缓存的密钥.
我不能使用Long.toString(longValue,16),因为它返回绝对值的十六进制字符串,前缀为" - ".
所以我的convertLongToHexString看起来像这样:
long mask = 0x00000000ffffffffL; long bottomHalf = number & mask; long upperHalf = (number >> 32) & mask; String bottomHalfString = Long.toString(bottomHalf, 16); if (bottomHalfString.length() != 8) { String zeroes = "0000000000000000"; bottomHalfString = zeroes.substring(16-bottomHalfString.length()) + bottomHalfString; } return Long.toString(upperHalf,16)+bottomHalfString;
必须有一种更优雅的方式来做到这一点.有什么建议?
这是我的实施.我已经重构它有一个函数接受long
并返回一个字符串.:-)
import java.math.BigInteger; class UInt64Test { public static void main(String[] args) { for (String arg : args) System.out.println(toUnsignedString(Long.parseLong(arg))); } private static final BigInteger B64 = BigInteger.ZERO.setBit(64); public static String toUnsignedString(long num) { if (num >= 0) return String.valueOf(num); return BigInteger.valueOf(num).add(B64).toString(); } }