Что такое/есть путь 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 не являются проблемой.)
Спасибо
Ответы
Ответ 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))