Подтвердить что ты не робот

Что такое/есть путь Scala для реализации этого Java "byte [] в Hex" class

Меня особенно интересуют методы Scala (2.8) для построения строк с форматами, а также интересные способы сделать такую ​​возможность легко доступной там, где она полезна (списки байтов, String,...?)..

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());
  }
}

Это всего лишь учебное упражнение (поэтому утилита и реализация Java не являются проблемой.)

Спасибо

4b9b3361

Ответ 1

Это не обрабатывает null так же, как ваш код.

object Hex {

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

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

}

Если вы хотите иметь возможность обрабатывать возможные массивы null, вам может быть лучше сделать это от вызова кода и выполнения:

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

Ответ 2

Возможно, есть более элегантные способы, но что-то вроде:

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

должен работать.

Ответ 3

Вместо null следует использовать тип Scala Option. (Это проверено с помощью 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))