Guest User

Untitled

a guest
Jan 21st, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. package hummingbird;
  2.  
  3. import java.nio.ByteBuffer;
  4. import java.util.*;
  5.  
  6. import static java.lang.Math.log;
  7.  
  8. /**
  9. * User: zhaoyao
  10. * Date: 11-9-24
  11. * Time: PM10:48
  12. */
  13. public class VariableByteCode {
  14.  
  15. private static byte[] encodeNumber(int n) {
  16. if (n == 0) {
  17. return new byte[]{0};
  18. }
  19. int i = (int) (log(n) / log(128)) + 1;
  20. byte[] rv = new byte[i];
  21. int j = i - 1;
  22. do {
  23. rv[j--] = (byte) (n % 128);
  24. n /= 128;
  25. } while (j >= 0);
  26. rv[i - 1] += 128;
  27. return rv;
  28. }
  29.  
  30. public static byte[] encode(List<Integer> numbers) {
  31. ByteBuffer buf = ByteBuffer.allocate(numbers.size() * (Integer.SIZE / Byte.SIZE));
  32. for (Integer number : numbers) {
  33. buf.put(encodeNumber(number));
  34. }
  35. buf.flip();
  36. byte[] rv = new byte[buf.limit()];
  37. buf.get(rv);
  38. return rv;
  39. }
  40.  
  41. public static List<Integer> decode(byte[] byteStream) {
  42. List<Integer> numbers = new ArrayList<Integer>();
  43. int n = 0;
  44. for (byte b : byteStream) {
  45. if ((b & 0xff) < 128) {
  46. n = 128 * n + b;
  47. } else {
  48. int num = (128 * n + ((b - 128) & 0xff));
  49. numbers.add(num);
  50. n = 0;
  51. }
  52. }
  53. return numbers;
  54. }
  55.  
  56. /**
  57. * 对于已经排序好的数字序列,不再对原始值进行编码,而是对与前一个值的差值进行编码
  58. * <p/>
  59. * [ 1, 2, 3, 4, 5, 6, 7 ]
  60. * --> [1, 1, 1, 1, 1, 1, 1]f
  61. *
  62. * @param numbers
  63. * @return
  64. */
  65. public static byte[] encodeInterpolate(List<Integer> numbers) {
  66. ByteBuffer buf = ByteBuffer.allocate(numbers.size() * (Integer.SIZE / Byte.SIZE));
  67. int last = -1;
  68. for (int i = 0; i < numbers.size(); i++) {
  69. Integer num = numbers.get(i);
  70. if (i == 0) {
  71. buf.put(encodeNumber(num));
  72. } else {
  73. buf.put(encodeNumber(num - last));
  74. }
  75. last = num;
  76. }
  77.  
  78. for (Integer number : numbers) {
  79. buf.put(encodeNumber(number));
  80. }
  81. buf.flip();
  82. byte[] rv = new byte[buf.limit()];
  83. buf.get(rv);
  84. return rv;
  85. }
  86.  
  87. public static List<Integer> decodeInterpolate(byte[] byteStream) {
  88. List<Integer> numbers = new ArrayList<Integer>();
  89. int n = 0;
  90. int last = -1;
  91. boolean notFirst = false;
  92. for (byte b : byteStream) {
  93. if ((b & 0xff) < 128) {
  94. n = 128 * n + b;
  95. } else {
  96. int num;
  97. if (notFirst) {
  98. num = last + (128 * n + ((b - 128) & 0xff));
  99.  
  100. } else {
  101. num = 128 * n + ((b - 128) & 0xff);
  102. notFirst = true;
  103. }
  104. last = num;
  105. numbers.add(num);
  106. n = 0;
  107. }
  108. }
  109. return numbers;
  110. }
  111.  
  112.  
  113. }
Add Comment
Please, Sign In to add comment