com.tencent.tinker.ziputils.ziputil.Memory Maven / Gradle / Ivy
/*
* Tencent is pleased to support the open source community by making Tinker available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* 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.tencent.tinker.ziputils.ziputil;
import java.nio.ByteOrder;
/**
* modify by zhangshaowen on 16/6/7.
*/
public final class Memory {
private Memory() { }
public static int peekInt(byte[] src, int offset, ByteOrder order) {
if (order == ByteOrder.BIG_ENDIAN) {
return (((src[offset++] & 0xff) << 24)
| ((src[offset++] & 0xff) << 16)
| ((src[offset++] & 0xff) << 8)
| ((src[offset ] & 0xff) << 0));
} else {
return (((src[offset++] & 0xff) << 0)
| ((src[offset++] & 0xff) << 8)
| ((src[offset++] & 0xff) << 16)
| ((src[offset ] & 0xff) << 24));
}
}
public static long peekLong(byte[] src, int offset, ByteOrder order) {
if (order == ByteOrder.BIG_ENDIAN) {
int h = ((src[offset++] & 0xff) << 24)
| ((src[offset++] & 0xff) << 16)
| ((src[offset++] & 0xff) << 8)
| ((src[offset++] & 0xff) << 0);
int l = ((src[offset++] & 0xff) << 24)
| ((src[offset++] & 0xff) << 16)
| ((src[offset++] & 0xff) << 8)
| ((src[offset ] & 0xff) << 0);
return (((long) h) << 32L) | ((long) l) & 0xffffffffL;
} else {
int l = ((src[offset++] & 0xff) << 0)
| ((src[offset++] & 0xff) << 8)
| ((src[offset++] & 0xff) << 16)
| ((src[offset++] & 0xff) << 24);
int h = ((src[offset++] & 0xff) << 0)
| ((src[offset++] & 0xff) << 8)
| ((src[offset++] & 0xff) << 16)
| ((src[offset ] & 0xff) << 24);
return (((long) h) << 32L) | ((long) l) & 0xffffffffL;
}
}
public static short peekShort(byte[] src, int offset, ByteOrder order) {
if (order == ByteOrder.BIG_ENDIAN) {
return (short) ((src[offset] << 8) | (src[offset + 1] & 0xff));
} else {
return (short) ((src[offset + 1] << 8) | (src[offset] & 0xff));
}
}
public static void pokeInt(byte[] dst, int offset, int value, ByteOrder order) {
if (order == ByteOrder.BIG_ENDIAN) {
dst[offset++] = (byte) ((value >> 24) & 0xff);
dst[offset++] = (byte) ((value >> 16) & 0xff);
dst[offset++] = (byte) ((value >> 8) & 0xff);
dst[offset ] = (byte) ((value >> 0) & 0xff);
} else {
dst[offset++] = (byte) ((value >> 0) & 0xff);
dst[offset++] = (byte) ((value >> 8) & 0xff);
dst[offset++] = (byte) ((value >> 16) & 0xff);
dst[offset ] = (byte) ((value >> 24) & 0xff);
}
}
public static void pokeLong(byte[] dst, int offset, long value, ByteOrder order) {
if (order == ByteOrder.BIG_ENDIAN) {
int i = (int) (value >> 32);
dst[offset++] = (byte) ((i >> 24) & 0xff);
dst[offset++] = (byte) ((i >> 16) & 0xff);
dst[offset++] = (byte) ((i >> 8) & 0xff);
dst[offset++] = (byte) ((i >> 0) & 0xff);
i = (int) value;
dst[offset++] = (byte) ((i >> 24) & 0xff);
dst[offset++] = (byte) ((i >> 16) & 0xff);
dst[offset++] = (byte) ((i >> 8) & 0xff);
dst[offset ] = (byte) ((i >> 0) & 0xff);
} else {
int i = (int) value;
dst[offset++] = (byte) ((i >> 0) & 0xff);
dst[offset++] = (byte) ((i >> 8) & 0xff);
dst[offset++] = (byte) ((i >> 16) & 0xff);
dst[offset++] = (byte) ((i >> 24) & 0xff);
i = (int) (value >> 32);
dst[offset++] = (byte) ((i >> 0) & 0xff);
dst[offset++] = (byte) ((i >> 8) & 0xff);
dst[offset++] = (byte) ((i >> 16) & 0xff);
dst[offset ] = (byte) ((i >> 24) & 0xff);
}
}
public static void pokeShort(byte[] dst, int offset, short value, ByteOrder order) {
if (order == ByteOrder.BIG_ENDIAN) {
dst[offset++] = (byte) ((value >> 8) & 0xff);
dst[offset ] = (byte) ((value >> 0) & 0xff);
} else {
dst[offset++] = (byte) ((value >> 0) & 0xff);
dst[offset ] = (byte) ((value >> 8) & 0xff);
}
}
}