java - 如何使用位掩码检查字节流中的字节
问题描述
我有bytebuffer
并且每次迭代读取 8 个字节(长)我有我想比较的位掩码,但我不确定我的模式应该是什么样子。例如,
private final static long ASCII_125 = 0x7D;
public static boolean isValidPath(
DirectBuffer path)
{
boolean isPathValid = true;
for (int i = 0; i < path.capacity(); i += Long.BYTES)
{
long charsLong = path.getLong(i);
if ((charsLong & result) != xxxxxx(pattern))
{
isPathValid = false;
break;
}
}
return isPathValid;
}
因此,如果 charlong 是0b01111011_01111011_00100101_00100101_01111011_01111011_01111101_01111101
并检查01111101
这 8 个字节中是否存在字节。我想我需要找到在逻辑上让我一次检查多个值的模式,为该模式构造一个掩码,然后一次将掩码应用于所有 8 个字节。但是我很难想出这个模式。
解决方案
像这样的东西怎么样:
这基本上通过移动长的右 8 位并将其屏蔽为一个字节来检查每个字节。
for (int i = 0; i < path.capacity(); i += Long.BYTES) {
long charsLong = path.getLong(i);
while(charsLong > 0) {
// get low order byte
byte val = (byte)(charLong&0xFF);
if ((val & result) != xxxxxx(pattern)) {
return false;
}
// right shift thru sign bit by 8 bits
charsLong>>>= 8;
}
}
return true;
请注意,如果您正在检查特定字节值,则只需将每个字节与结果字节进行比较。但是,如果您想检查字节中是否设置了某些位,那么您需要一个位掩码。
例如,要查看是否设置了低位 101 位,您将执行以下操作。
byte bitMask = 0b101;
if ((test & bitMask) == bitMask) {
bits are set.
}
推荐阅读
- python - django 模型 - 我如何创建抽象方法
- node.js - NooB Alert NodeJs 和 Slack Bot 构建。需要建议
- ios - 在 iPhone 上非技术安装 Unity 应用程序以进行测试
- r - 如何合并不同大小的数据框并添加空白数据?
- google-sheets - 谷歌数据洞察日期和文本
- python - 发现scipy稀疏矩阵负列索引
- c# - 自定义 Iban 数据注释客户端验证
- mysql - 图表部分未打开 Data Grip Ubuntu
- keras - 是否有可能在 Keras 中可视化中间层?
- javascript - dc.js 响应式地图和缩放功能(鼠标滚轮)