Scala 将十六进制字符串转换为字节

Scala 将十六进制字符串转换为字节,scala,protocol-buffers,Scala,Protocol Buffers,Scala中有没有一种简洁的方法可以通过TestRing将一个六进制编码的字符串转换成protobuf(然后再转换回来)?您可以使用java.math.BigInteger解析字符串,获取数组[字节],然后从那里将其转换成ByteString。这是第一步: import java.math.BigInteger val s = "f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e" val bs = new BigInteger(s, 1

Scala中有没有一种简洁的方法可以通过TestRing将一个六进制编码的
字符串转换成protobuf
(然后再转换回来)?

您可以使用
java.math.BigInteger
解析
字符串,获取
数组[字节]
,然后从那里将其转换成
ByteString
。这是第一步:

import java.math.BigInteger

val s = "f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e"

val bs = new BigInteger(s, 16).toByteArray
bs
的内容现在是:

Array(0, -14, 99, 87, 94, 123, 0, -87, 119, -88, -23, -93, 126, 8, -71, -62, 21, -2, -71, -65, -78, -7, -110, -78, -72, -15, 30)
然后,您可以(例如)使用
copyFrom
方法(JavaDoc)将其转换为
ByteString

,您可以使用(无其他依赖项)如下所示:

import com.google.protobuf.ByteString
导入javax.xml.bind.DatatypeConverter
val hexString:String=“87C2D268483583714CD5”
val byteString:byteString=byteString.copyFrom(
DatatypeConverter.parseHexBinary(hexString)
)
val originalString=DatatypeConverter.printHexBinary(byteString.toByteArray)

由于问题的标题没有提到Protobuf,如果任何人正在寻找一种解决方案,该解决方案不需要任何依赖项来将十六进制字符串转换为任意大小的数组的Seq[Byte]:(不要忘记必要时添加输入验证)

val zeroChar:Byte='0'
val aChar:字节='a'。toByte
def-toHex(bytes:Seq[Byte]):String=bytes.map(b=>f“$b%02x”).mkString
def toBytes(十六进制:字符串):Seq[字节]={
val lowerHex=十六进制到小写
val(结果:数组[字节],起始值:Int)=
如果(lowerHex.length%2==1){
//奇怪的
val r=新数组[字节]((lowerHex.length>>1)+1)
r(0)=音调(下限(0))
(r,1)
}否则{
//甚至
(新数组[字节](lowerHex.length>>1),0)
}
var inputIndex=STARTOFSET
var outputIndex=STARTOFSET
while(outputIndex

为什么要使用
akka.util.ByteString
呢?我的错误更新答案是使用
com.google.protobuf.ByteString
。这只适用于高达64位的数据,对于小得多的数据来说是浪费。