gpt4 book ai didi

java - 节省空间的长表示

转载 作者:行者123 更新时间:2023-12-01 07:40:55 26 4
gpt4 key购买 nike

我想在 Java 中获取一个 long 值,并将其转换为字节数组。

但是,我希望小值的表示形式较小,因此如果值小于 127,则可能只需要一个字节。

编码和解码算法应该非常高效。

我确信这已经完成,但我找不到任何示例代码,有人有任何指示吗?

最佳答案

您可以使用停止位编码,例如

public static void writeLong(OutputStream out, long value) throws IOException {
while(value < 0 || value > 127) {
out.write((byte) (0x80 | (value & 0x7F)));
value = value >>> 7;
}
out.write((byte) value);
}

public static long readLong(InputStream in) throws IOException {
int shift = 0;
long b;
long value = 0;
while((b = in.read()) >= 0) {
value += (b & 0x7f) << shift;
shift += 7;
if ((b & 0x80) == 0) return value;
}
throw new EOFException();
}

这是一种快速的压缩形式,但所有压缩都是有代价的。 (但是,如果您的带宽有限,传输速度可能会更快并且值得)

顺便说一句:值 0 到 127 使用一个字节。您也可以对 shortint 值使用相同的例程。

编辑:在此之后您仍然可以使用通用压缩,并且它可以比不使用它更小。

public static void main(String... args) throws IOException {
long[] sequence = new long[1024];
Random rand = new Random(1);
for (int i = 0; i < sequence.length; i+=2) {
sequence[i] = (long) Math.pow(2, rand.nextDouble() * rand.nextDouble() * 61);
// some pattern.
sequence[i+1] = sequence[i] / 2;
}
testDeflator(sequence);
testStopBit(sequence);
testStopBitDeflator(sequence);
}

private static void testDeflator(long[] sequence) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(new DeflaterOutputStream(baos));
for (long l : sequence)
dos.writeLong(l);
dos.close();
System.out.println("Deflator used " + baos.toByteArray().length);
}


private static void testStopBit(long[] sequence) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (long l : sequence)
writeLong(baos, l);
baos.close();
System.out.println("Stop bit used " + baos.toByteArray().length);
}

private static void testStopBitDeflator(long[] sequence) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(new DeflaterOutputStream(baos));
for (long l : sequence)
writeLong(dos, l);
dos.close();
System.out.println("Stop bit & Deflator used " + baos.toByteArray().length);
}

public static void writeLong(OutputStream out, long value) throws IOException {
while (value < 0 || value > 127) {
out.write((byte) (0x80 | (value & 0x7F)));
value = value >>> 7;
}
out.write((byte) value);
}

打印

Deflator used 3492
Stop bit used 2724
Stop bit & Deflator used 2615

最有效的方法很大程度上取决于您发送的数据。例如如果您的数据确实是随机的,那么您使用的任何压缩技术只会使数据变得更大。

Deflator 是 GZip 输出的精简版本(减去 header 和 CRC32)

关于java - 节省空间的长表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5022956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com