All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.code.yanf4j.util.ByteBufferUtils Maven / Gradle / Ivy

There is a newer version: 2.4.8
Show newest version
/**
 * Copyright [2009-2010] [dennis zhuang([email protected])] Licensed under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You
 * may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
 * applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
 * the License for the specific language governing permissions and limitations under the License
 */
/**
 * Copyright [2009-2010] [dennis zhuang([email protected])] Licensed under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You
 * may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
 * applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
 * the License for the specific language governing permissions and limitations under the License
 */
package com.google.code.yanf4j.util;

/*
 * Copyright 2004-2005 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
/**
 * 来自于cindy2.4的工具类,做了简化和新增
 */
import java.nio.ByteBuffer;
import com.google.code.yanf4j.config.Configuration;

public class ByteBufferUtils {
  /**
   * 
   * @param byteBuffer
   * @return *
   */
  public static final ByteBuffer increaseBufferCapatity(ByteBuffer byteBuffer) {

    if (byteBuffer == null) {
      throw new IllegalArgumentException("buffer is null");
    }
    if (Configuration.DEFAULT_INCREASE_BUFF_SIZE < 0) {
      throw new IllegalArgumentException("size less than 0");
    }

    int capacity = byteBuffer.capacity() + Configuration.DEFAULT_INCREASE_BUFF_SIZE;
    if (capacity < 0) {
      throw new IllegalArgumentException("capacity can't be negative");
    }
    ByteBuffer result = (byteBuffer.isDirect() ? ByteBuffer.allocateDirect(capacity)
        : ByteBuffer.allocate(capacity));
    result.order(byteBuffer.order());
    byteBuffer.flip();
    result.put(byteBuffer);
    return result;
  }

  public static final void flip(ByteBuffer[] buffers) {
    if (buffers == null) {
      return;
    }
    for (ByteBuffer buffer : buffers) {
      if (buffer != null) {
        buffer.flip();
      }
    }
  }

  public static final ByteBuffer gather(ByteBuffer[] buffers) {
    if (buffers == null || buffers.length == 0) {
      return null;
    }
    ByteBuffer result = ByteBuffer.allocate(remaining(buffers));
    result.order(buffers[0].order());
    for (int i = 0; i < buffers.length; i++) {
      if (buffers[i] != null) {
        result.put(buffers[i]);
      }
    }
    result.flip();
    return result;
  }

  public static final int remaining(ByteBuffer[] buffers) {
    if (buffers == null) {
      return 0;
    }
    int remaining = 0;
    for (int i = 0; i < buffers.length; i++) {
      if (buffers[i] != null) {
        remaining += buffers[i].remaining();
      }
    }
    return remaining;
  }

  public static final void clear(ByteBuffer[] buffers) {
    if (buffers == null) {
      return;
    }
    for (ByteBuffer buffer : buffers) {
      if (buffer != null) {
        buffer.clear();
      }
    }
  }

  public static final String toHex(byte b) {
    return ("" + "0123456789ABCDEF".charAt(0xf & b >> 4) + "0123456789ABCDEF".charAt(b & 0xf));
  }

  public static final int indexOf(ByteBuffer buffer, ByteBuffer pattern) {
    if (pattern == null || buffer == null) {
      return -1;
    }
    int n = buffer.remaining();
    int m = pattern.remaining();
    int patternPos = pattern.position();
    int bufferPos = buffer.position();
    if (n < m) {
      return -1;
    }
    for (int s = 0; s <= n - m; s++) {
      boolean match = true;
      for (int i = 0; i < m; i++) {
        if (buffer.get(s + i + bufferPos) != pattern.get(patternPos + i)) {
          match = false;
          break;
        }
      }
      if (match) {
        return (bufferPos + s);
      }
    }
    return -1;
  }

  public static final int indexOf(ByteBuffer buffer, ByteBuffer pattern, int offset) {
    if (offset < 0) {
      throw new IllegalArgumentException("offset must be greater than 0");
    }
    if (pattern == null || buffer == null) {
      return -1;
    }
    int patternPos = pattern.position();
    int n = buffer.remaining();
    int m = pattern.remaining();
    if (n < m) {
      return -1;
    }
    if (offset < buffer.position() || offset > buffer.limit()) {
      return -1;
    }
    for (int s = 0; s <= n - m; s++) {
      boolean match = true;
      for (int i = 0; i < m; i++) {
        if (buffer.get(s + i + offset) != pattern.get(patternPos + i)) {
          match = false;
          break;
        }
      }
      if (match) {
        return (offset + s);
      }
    }
    return -1;
  }

  /**
   * 查看ByteBuffer数组是否还有剩余
   * 
   * @param buffers ByteBuffers
   * @return have remaining
   */
  public static final boolean hasRemaining(ByteBuffer[] buffers) {
    if (buffers == null) {
      return false;
    }
    for (int i = 0; i < buffers.length; i++) {
      if (buffers[i] != null && buffers[i].hasRemaining()) {
        return true;
      }
    }
    return false;
  }

  public static final int uByte(byte b) {
    return b & 0xFF;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy