MisterChangRay / magic-byte

a java tool for faster convertor byte2object
BSD 3-Clause "New" or "Revised" License
49 stars 20 forks source link

能否提供一个方法获取标记为 magicclass 的类的二进制数据长度 #48

Closed FULaBUla closed 10 months ago

FULaBUla commented 10 months ago

能否提供一个方法获取标记为 magicclass 的类的二进制数据长度。长度有两种,一种是格式长度,就是那种根据协议字段定义的 magicfiled 长度;一种是填充数据后的长度,主要是有字段是动态长度的,填充值之后才能知道总长度。

MisterChangRay commented 10 months ago

有的, MagicByte.structBytes 。 但是只能获取固定类型的字节数

参考: https://github.com/MisterChangRay/magic-byte/wiki/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E7%B1%BB%E6%96%B9%E6%B3%95

FULaBUla commented 10 months ago

有的, MagicByte.structBytes 。 但是只能获取固定类型的字节数

参考: https://github.com/MisterChangRay/magic-byte/wiki/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E7%B1%BB%E6%96%B9%E6%B3%95

那是否可以对带动态长度属性的对象填充数据后的长度进行支持呢?

MisterChangRay commented 10 months ago

有的, MagicByte.structBytes 。 但是只能获取固定类型的字节数 参考: https://github.com/MisterChangRay/magic-byte/wiki/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E7%B1%BB%E6%96%B9%E6%B3%95

那是否可以对带动态长度属性的对象填充数据后的长度进行支持呢?

既然已经序列化了,直接获取字节数组长度不就是了吗

FULaBUla commented 10 months ago

有的, MagicByte.structBytes 。 但是只能获取固定类型的字节数 参考: https://github.com/MisterChangRay/magic-byte/wiki/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E7%B1%BB%E6%96%B9%E6%B3%95

那是否可以对带动态长度属性的对象填充数据后的长度进行支持呢?

既然已经序列化了,直接获取字节数组长度不就是了吗

我有这种:对象有了,只需要长度不需要序列化成二进制的情况,因为我要长度提前准备做分片,然后重新填充头里的数据

MisterChangRay commented 10 months ago

但是有动态字段的话,不序列化也不能知道具体长度的啊。

FULaBUla commented 10 months ago

但是有动态字段的话,不序列化也不能知道具体长度的啊。

是,但是可以直接算,就是固定长度的加被标记为 dynamicSizeof 的属性的值就是总长度,是需要的,否则我现在的情况是需要从整体长度里取动态长度的头(头里有实现 customConvert 的属性,所以长度不确定),我不得不先反序列化再序列化一下得出长度,再把长度和反序列化的值放倒 MResult 里,有点儿多此一举的感觉

MisterChangRay commented 10 months ago

那就是 MagicByte.structBytes他了,动态数据结构返回最小值

FULaBUla commented 10 months ago

那就是 MagicByte.structBytes他了,动态数据结构返回最小值

那没有意义,我自己封装了一套框架,从业务系统传入 bean,我要先从 bean 里解出头,然后做别的操作,这个因为咱们框架可以直接从完整的二进制里解出最开始的头,但是我却不知道解出来用了多少字节,还要序列化回去才能知道,太多此一举了。但是MagicByte.structBytes ,动态数据结构返回最小值又和我实际长度不一致

MisterChangRay commented 10 months ago

报文头部不都是固定长度吗? 不过你可以自定义解析报文体,当调用自定义解析的时候会传入下一次解析位置,也就变相知道头有多大了。

FULaBUla commented 10 months ago

报文头部不都是固定长度吗? 不过你可以自定义解析报文体,当调用自定义解析的时候会传入下一次解析位置,也就变相知道头有多大了。

不是固定的,因为我里面有个动态长度的 ip 字段,支持 ipv6 和 ipv4 所以长度是动态的。

“自定义解析报文体”这个是不是意味着我解析对象里封装一个 Header 和一个 Object body,然后对 body 做自定义解析,拿 nextIndex。

但是我的框架是可以对应多个项目的,不同项目头不一样,所以我 Header 也是 Object 类型,用自定义解析来操作的,自定义解析的时候 再调用 MagicBytes.pack 方法传入的类型是我通过注入我额外写的 getHeaderClazz 接口的实现类获取的,所以这个时候我调用 MResult.build 需要告诉咱这个框架我用了多少字节,这个目前就只能反序列化再序列化获取长度了,如果能直接计算就可以省掉序列化浪费的时间和内存空间

MisterChangRay commented 10 months ago

你们报文设计不会IP在报文类型前面吧

FULaBUla commented 10 months ago

你们报文设计不会IP在报文类型前面吧

ip 就在私有协议的报文头里。

主要是因为封了一个通用协议对象,第一个属性是头,不同项目的头不一样,所以头的长度必须反序列化之后才能知道长度,但是 MResult 里要填长度,所以我不得不再反序列化回去,才能知道从全部数据中用了多少字节反序列化出的头

FULaBUla commented 10 months ago

你们报文设计不会IP在报文类型前面吧

ip 就在私有协议的报文头里。

主要是因为封了一个通用协议对象,第一个属性是头,不同项目的头不一样,所以头的长度必须反序列化之后才能知道长度,但是 MResult 里要填长度,所以我不得不再反序列化回去,才能知道从全部数据中用了多少字节反序列化出的头

哥哥哥,看看这个问题

MisterChangRay commented 10 months ago

Mresult是自定义序列化的啊,既然是自己读的数据,读了多少肯定能知道啊。

如果你用框架的话,现在确实没有返回读取的字节数, 可以考虑后面新增一个方法:返回读取的字节数和对象

FULaBUla commented 10 months ago

Mresult是自定义序列化的啊,既然是自己读的数据,读了多少肯定能知道啊。

如果你用框架的话,现在确实没有返回读取的字节数, 可以考虑后面新增一个方法:返回读取的字节数和对象

因为我是这么用的 image 先解了个头出来,但是头里是有动态长度字段的,所以这么解出来我不知道头用了多少字节。

希望新增一个方法:返回读取的字节数和对象,这个可以满足需求,返回类型感觉直接用 MResult 就行