groovy 的多重数据转换
Multiple data conversion with groovy
我在对某些数据进行多次转换时遇到问题。
我收到一个包含 base64 编码字节的请求的响应,我想以六进制格式获取它们。
这是字符串类型:
log.info "type data base 64 : " + dataBase64.getClass().getName()
INFO:type data base 64 : java.lang.String
然后我解码它:
data = dataBase64.decodeBase64()
log.info "type data : " + data.getClass().getName()
INFO:type data : [B => ?? there is something strange here
log.info "data = " + data
INFO:data = [0, 33, 0, 0, -74, 0, 16, 0, 0, 1, 0, 10, 3, 0, 0, 0, 28, 120, -45, 28, 90, 95, 25, -14, -119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我想要这个数据以字节为单位,以便恢复字节 22 到 24 的地址
如果我这样做
log.info "dataHex = " + data.encodeHex()
INFO:dataHex = 00210000b60010000001000a030000001c78d31c5a5f19f289ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01000000000000000000000000000000000000000000000000000000000000000000000000000000
我想恢复 19f289
部分。问题是我无法将 data[22] 转换为 data[24]
data[22].encodeHex
失败(data[22] 类型是 Byte,不是 Byte[])
如果我尝试在每个需要的字节上使用 toHexString,我在处理负值时会遇到问题
for (i=22;i<25;i++)
{
myInt = data[i]
log.info Integer.toHexString(myInt)
}
给予
INFO:19
INFO:fffffff2
INFO:ffffff89
有什么干净的方法可以做到这一点吗?
我可以尝试在转换为字符串后从 dataHex 中提取子字符串(我还没有尝试过)但我不明白为什么我可以简单地将一个字节转换为十六进制
如果有人知道...
嗯,
在同事的帮助下提高了我对 Groovy 的了解后,这里有一个更干净的方法来恢复我想要的数据:
dataHex = data.encodeHex().toString()
log.info "data hex in bytes = ${dataHex}"
// group data by bytes
def dataHexBy2 = dataHex.toList().collate(2)*.join()
log.info " group by 2 " + dataHexBy2
def address = ""
for (i=22;i<25;i++)
{
address = address + dataHexBy2[i]
}
log.info "address = ${address}"
我终于得到地址 = 19f289
我在对某些数据进行多次转换时遇到问题。 我收到一个包含 base64 编码字节的请求的响应,我想以六进制格式获取它们。
这是字符串类型:
log.info "type data base 64 : " + dataBase64.getClass().getName()
INFO:type data base 64 : java.lang.String
然后我解码它:
data = dataBase64.decodeBase64()
log.info "type data : " + data.getClass().getName()
INFO:type data : [B => ?? there is something strange here
log.info "data = " + data
INFO:data = [0, 33, 0, 0, -74, 0, 16, 0, 0, 1, 0, 10, 3, 0, 0, 0, 28, 120, -45, 28, 90, 95, 25, -14, -119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我想要这个数据以字节为单位,以便恢复字节 22 到 24 的地址 如果我这样做
log.info "dataHex = " + data.encodeHex()
INFO:dataHex = 00210000b60010000001000a030000001c78d31c5a5f19f289ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01000000000000000000000000000000000000000000000000000000000000000000000000000000
我想恢复 19f289
部分。问题是我无法将 data[22] 转换为 data[24]
data[22].encodeHex
失败(data[22] 类型是 Byte,不是 Byte[])
如果我尝试在每个需要的字节上使用 toHexString,我在处理负值时会遇到问题
for (i=22;i<25;i++)
{
myInt = data[i]
log.info Integer.toHexString(myInt)
}
给予
INFO:19
INFO:fffffff2
INFO:ffffff89
有什么干净的方法可以做到这一点吗? 我可以尝试在转换为字符串后从 dataHex 中提取子字符串(我还没有尝试过)但我不明白为什么我可以简单地将一个字节转换为十六进制
如果有人知道...
嗯,
在同事的帮助下提高了我对 Groovy 的了解后,这里有一个更干净的方法来恢复我想要的数据:
dataHex = data.encodeHex().toString()
log.info "data hex in bytes = ${dataHex}"
// group data by bytes
def dataHexBy2 = dataHex.toList().collate(2)*.join()
log.info " group by 2 " + dataHexBy2
def address = ""
for (i=22;i<25;i++)
{
address = address + dataHexBy2[i]
}
log.info "address = ${address}"
我终于得到地址 = 19f289