首页 > 解决方案 > 如何使用位掩码检查字节流中的字节

问题描述

我有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 个字节。但是我很难想出这个模式。

标签: javabinarybitmask

解决方案


像这样的东西怎么样:

这基本上通过移动长的右 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.
}


推荐阅读