Taira icon indicating copy to clipboard operation
Taira copied to clipboard

请问,可以直接对16进制字符串截取指定长度的内容吗

Open zolagz opened this issue 3 years ago • 2 comments

s1 = "0100011D020101007B000004D21E00980000619DAC9B0202007B000004D21E00980000619DAC9B020101DD305A073E6C404600190113393255b0c0005b00d"

public class Ts01 implements TairaData { // 定位方式 @ParamField(order = 0) public byte positionType; // 附加定位数据 @ParamField(order = 1) public byte attach; // 纬度 @ParamField(order = 2) public int latitude; // 经度 @ParamField(order = 3) public int longitude;

//    国际移动台识别码
@ParamField(order = 4)
public String imsi;

//    区号
@ParamField(order = 5)
public short Code;

//    DWORD
@ParamField(order = 6)
public int cellId;

}

我想截取s1中的 0460019011339325 赋值给 imsi,请问该怎样操作呀?

zolagz avatar Dec 11 '22 10:12 zolagz

提供一个思路:Taira 定义的属性可以从类型、annotation 的 bytes 值计算出序列化之后占用的 bytes 大小,所以本质上可以直接从原始 bytes(或者 bytes string)里面直接定位到对应属性的起始位置和终止位置。

例如上面 Ts01.imsi 可以看作前面有这些 bytes:byte + byte + 8 bytes + 8 bytes = 18 bytes。 imsi 本身的长度从 @ParamField 可以读取,那么用 substring 可截取到对应的值。

arakuma avatar Dec 11 '22 12:12 arakuma

感谢大神指导,已解决!谢谢;

@ParamField(order = 4,bytes = 8)
public byte[] imsi;

然后使用 cn.hutool.core.util.HexUtil.encodeHexStr(imsi) 打印出来:imsi='0460019011339325'

zolagz avatar Dec 16 '22 10:12 zolagz