什么是实现这个Java"byte []到Hex"类的Scala方式

nic*_*bot 26 java scala

我在斯卡拉特别感兴趣(2.8)技术与格式字符串建设,以及有趣的方式来做出这样的能力,容易接近的地方是非常有用的(字节的列表,字符串,...?)..

public class Hex {
  public static String valueOf (final byte buf[]) {
    if (null == buf) {
      return null;
    }
    final StringBuilder sb = new StringBuilder(buf.length * 2);
    for (final byte b : buf) {
      sb.append(String.format("%02X", b & 0xff));
    }
    return sb.toString();
  }

  public static String valueOf (final Byteable o) {
    return valueOf(o.toByteArray());
  }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个学习练习(因此Java的实用程序和实现不是问题.)

谢谢

Ben*_*ngs 62

null与您的代码的处理方式不同.

object Hex {

  def valueOf(buf: Array[Byte]): String = buf.map("%02X" format _).mkString

  def valueOf(o: Byteable): String = valueOf(o.toByteArray)

}
Run Code Online (Sandbox Code Playgroud)

如果您希望能够处理可能的null数组,那么通过调用代码并执行以下操作可能会更好:

val bytes: Array[Byte] = // something, possibly null
val string: Option[String] = Option(bytes).map(Hex.valueOf)
Run Code Online (Sandbox Code Playgroud)

  • 我无法在Scala中找到"Byteable".我必须使用哪种进口产品? (3认同)
  • 请不要在性能关键代码中使用任何基于“格式”的解决方案。例如,这个 https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Hex.html 比此处的任何格式化解决方案快约 *135 倍*。 (2认同)

Arj*_*ijl 9

也许有更优雅的方式,但有类似的东西:

def valueOf(bytes : List[Byte]) = bytes.map{
  b => String.format("%02X", new java.lang.Integer(b & 0xff)) 
}.mkString
Run Code Online (Sandbox Code Playgroud)

应该管用.


mic*_*ebe 5

您应该使用Scala的Option类型而不是null.(这是使用Scala 2.8.0.RC1测试的)

object Hex {
  def valueOf (buf: Array[Byte]) = {
    if (null == buf) {
      None
    } else {
      val sb = new StringBuilder(buf.length * 2)
      for (b <- buf) {
        sb.append("%02X".format(b & 0xff))
      }
      Some(sb.toString())
    }
  }
  /*
  def valueOf(o: Byteable) = {
    return valueOf(o.toByteArray());
  }
  */
}

println(Hex.valueOf(Array(-3, -2, -1, 0, 1, 2, 3)))
println(Hex.valueOf(null))
Run Code Online (Sandbox Code Playgroud)

  • 我觉得在纯scala代码中你应该假设buf永远不会为null并使其成为调用者的责任.如果您始终使用Option而不是null-able值,则此问题会优雅地消失.唯一的问题是需要java-interop的代码. (2认同)