java - 在java中读取c ++字节位域
问题描述
我有一些遗留系统使用 C++ 中的位域生成字节 [] 数组,这些位域将通过网络发送
struct date_compressed {
unsigned int d:5; //2 bytes
unsigned int m:4; //1 bytes
unsigned int y; //4 bytes
};
This produces a hex string of 9fd3d46fde070000
我需要能够在 Java 中读取这些字节并读取正确的值,我该怎么做?
我正在查看一些 ByteBuf 库,如 netty 等,但我找不到任何好的例子,我们如何做到这一点。
谢谢
解决方案
使用 a ByteBuffer
,并确保正确设置字节顺序。
例子
byte[] data = new byte[7];
// fill data here
ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
int d = buf.getShort() & 0x1f; // 2 bytes, 5 bits, unsigned
int m = buf.get() & 0xf; // 1 byte, 4 bits, unsigned
int y = buf.getInt(); // 4 bytes, 32 bits, signed
当然,年份值是有符号的,而不是像指定的 C++ 代码那样无符号,但是你不会有那么大的年份值。
推荐阅读
- git - 如何减少本地裸存储库中的 git pack 文件大小?
- oracle - 数据迁移 - 验证在主键可以更改的位置加载的数据
- c# - 如何在 Azure Function App 运行时更新应用程序设置中的单个值
- c# - xamarin IOS:警告:应用程序无法安装+启动
- javascript - 使用 NgRx,在状态对象中重置或返回空数组的正确方法是什么?
- excel - 创建数据透视表时 Excel 数据透视表错误 1004
- python - pd.merge 时处理空值
- php - PHP - 返回 NULL 的日期时间会引发错误
- sql - 我如何调整这个选择语句以防止它多次从同一个表中选择?
- select - 为什么打开弹出框关闭选择?