使用groovy进行多次数据转换

时间:2017-11-21 10:58:54

标签: java groovy data-conversion

我在对某些数据进行多次转换时遇到问题。 我从包含base64编码字节的请求中得到响应,并且我希望将它们以hexa形式获取。

这是一个String类型:

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部分。问题是我无法将数据[22]转换为数据[24] data[22].encodeHex失败(数据[22]类型为字节,而不是字节[])

如果我尝试在每个字节上使用toHexString,我在处理负值时会遇到问题

for (i=22;i<25;i++)
{
    myInt = data[i]
    log.info Integer.toHexString(myInt) 
}

给出

INFO:19
INFO:fffffff2
INFO:ffffff89

有没有干净的方法呢? 我可以尝试在转换为String后从dataHex中提取子字符串(我还没有尝试过)但我不明白为什么我只能将一个字节转换为十六进制

如果有人知道......

1 个答案:

答案 0 :(得分:0)

好吧,

感谢同事提高了我对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