java - 混合大小写base16(十六进制)解码的轻量级方法

标签 java guava

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/

相关文章:

java - 在 springboot 应用程序 java.lang.IllegalArgumentException : Not a managed type 中出现此错误

java - Joda时间周计算推理

java - Spring-Boot 无法添加 Google Guava 依赖

java - 使用 Guava 的 ImmutableSortedMap 作为频率图

Java - Orika 1.4.5 - OutOfMemoryException : PermGen Space

java - Selenium : The browser is getting opened but not able to get URL in the browser

java - 需要有关 Drools -version 7.X 与 java 11 兼容性的更多信息

java - ListenableFuture 链可以处理内部 ExecutionException 吗?

java - 在 Java 中从键值对构建映射

java/guava - 从 iterable 中收集删除的元素