Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于获取/设置字节数组中特定位的Java类_Java_Byte_Bytearray - Fatal编程技术网

用于获取/设置字节数组中特定位的Java类

用于获取/设置字节数组中特定位的Java类,java,byte,bytearray,Java,Byte,Bytearray,我正在寻找一个助手类,该类可以修改bytearray中的特定位,其API类似于以下内容: void Set(int startPos, int lengthInBits, int value) { // Set the bits starting at startPos to the binary representation of value // Error if the binary representation of value is too long (ie. exceeds

我正在寻找一个助手类,该类可以修改bytearray中的特定位,其API类似于以下内容:

void Set(int startPos, int lengthInBits, int value) {
  // Set the bits starting at startPos to the binary representation of value
  // Error if the binary representation of value is too long (ie. exceeds lengthInBits)
}
其目的是能够将任意长度的特定值放入bytearray中—一些值的长度将小于一个字节,其他值的长度将大于一个字节,而一些值的长度将“跨越”字节

我已经看过了,但这似乎有点太高级了,只处理整个字节,将int和short转换为多个字节,而不是让您选择它们的最大位数

我还研究了,但这次它似乎有点太低级了,因为它只在单位级别工作(尽管我可能会将其作为使用上述API构建某些东西的起点)


还有一个旧的堆栈溢出,主要与有符号/无符号位的使用有关,但图中的数据结构是我试图构建的类型(发送到外部客户机的消息),我希望尽可能隐藏位转移的复杂性。

这并不难。也许这可以帮助您作为一个起点:

ByteBuffer data;

int getBits(int bitOff, int bitSize)
{
  if(bitSize>32) throw new UnsupportedOperationException();
  final int mask= bitSize==32? -1: (1<<bitSize)-1;
  return (int)((data.getLong(bitOff>>>3) >>> (64-bitSize-(bitOff&7))) & mask);
}
void putBits(int bitOff, int bitSize, int intValue)
{
  final int byteOff=bitOff>>>3;
  bitOff -= byteOff<<3;
  final int shift = 64-bitSize-bitOff;
  long mask=Long.rotateLeft((-1L)<<bitSize, shift), lValue=intValue&0xffffffffL;
  data.putLong(byteOff, (lValue << shift) | (data.getLong(byteOff)&mask));
}
字节缓冲数据;
int getBits(int bitOff,int bitSize)
{
如果(位大小>32)抛出新的UnsupportedOperationException();
最终整数掩码=位大小==32?-1:(1>3)>>>(64位大小-(bitOff&7))&掩码);
}
无效putBits(int-bitOff、int-bitSize、int-intValue)
{
最后一个int字节=bitOff>>>3;

bitOff-=byteOff您可以扩展java.util.BitSet,它已经处理了任意位数的存储。您只需要添加批量获取/设置操作:

public class BulkBitSet extends BitSet {

    public void bulkSet(int offset, int count, int data) {
        int ptr = offset + count;
        for (int i=0; i<count; ++i) {
            set(--ptr, (data & (1 << i)) == 0 ? false : true);
        }
    }

    public int bulkGet(int offset, int count) {
        int result = 0;
        for (int i=0; i<count; ++i) {
            result <<= 1;
            if (get(offset + i))
                result |= 1;
        }
        return result;
    }

}
公共类BulkBitSet扩展了位集{
公共集合(整数偏移量、整数计数、整数数据){
int ptr=偏移量+计数;

对于(int i=0;iThanks),理想情况下,我正在寻找一个提供此类功能的现有类/库,这样我就不需要创建自定义类&测试一些我认为是非常常见的问题的东西。不过可能没有任何东西。。。