Guava 具有允许 base16/hexadecimal 的接口(interface)编码和解码。是否有一种轻量级的方法或技巧可以读取可能包含大小写混合的十六进制数?
我的意思是轻量级:
- 不复制输入字符串(因此不允许
toUpperCase()
) - 几行代码
- 少量附加指令(性能)
该解决方案应该不需要在 Java SE 之上使用额外的库,并且应该能够返回相对较大的字节数组。
代码示例:
byte[] decoded = BaseEncoding.base16().decode("abCD");
将导致:
com.google.common.io.BaseEncoding$DecodingException: Unrecognized character: a
使用 Guava 版本 15.0(提出此问题时的最新版本)。
最佳答案
Integer.parseInt(string, 16);
完全按照您的描述进行操作。如果这对你来说太容易了,你可以研究它的实现来学习如何做这样的事情。但它不止几行,因为它会处理你自己做时可能忘记的所有极端情况。例如。允许的最大绝对值因正值和负值而异。优化的十六进制和任意基数解析之间的唯一区别是您可以使用 result<<=4;
而不是 result *= radix;
对于十六进制情况。
鉴于您更新的问题,研究该方法的建议仍然适用。解码字节序列而不是 int
会更简单:
import static java.lang.Character.digit;
…
static byte[] decode(CharSequence cs)
{
final int numCh = cs.length();
if((numCh&1)!=0)
throw new IllegalArgumentException("cs must have an even length");
byte[] array=new byte[numCh>>1];
for(int p=0; p<numCh; p+=2)
{
int hi=digit(cs.charAt(p), 16), lo=digit(cs.charAt(p+1), 16);
if((hi|lo)<0)
throw new IllegalArgumentException(cs+" contains non-hex characters");
array[p>>1]=(byte)(hi<<4|lo);
}
return array;
}
关于java - 混合大小写base16(十六进制)解码的轻量级方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20980225/