6579f7ec9498113b440147fd09b5b8c85f802efd
[org.ibex.core.git] / src / org / xwt / util / PackBytesIntoString.java
1 package org.xwt.util;
2 import java.io.*;
3 import java.util.*;
4
5 /** packs 8-bit bytes into a String of 7-bit chars (to avoid the UTF-8 non-ASCII penalty) */
6 public class PackBytesIntoString {
7
8     public static String pack(byte[] b, int off, int len) throws IllegalArgumentException {
9         if (len % 7 != 0) throw new IllegalArgumentException("len must be a multiple of 7");
10         StringBuffer ret = new StringBuffer();
11         for(int i=off; i<off+len; i += 7) {
12             long l = 0;
13             for(int j=6; j>=0; j--) {
14                 l <<= 8;
15                 l |= (b[i + j] & 0xff);
16             }
17             for(int j=0; j<8; j++) {
18                 ret.append((char)(l & 0x7f));
19                 l >>= 7;
20             }
21         }
22         return ret.toString();
23     }
24
25     public static byte[] unpack(String s) throws IllegalArgumentException {
26         if (s.length() % 8 != 0) throw new IllegalArgumentException("string length must be a multiple of 8");
27         byte[] ret = new byte[(s.length() / 8) * 7];
28         for(int i=0; i<s.length(); i += 8) {
29             long l = 0;
30             for(int j=7; j>=0; j--) {
31                 l <<= 7;
32                 l |= (s.charAt(i + j) & 0x7fL);
33             }
34             for(int j=0; j<7; j++) {
35                 ret[(i / 8) * 7 + j] = (byte)(l & 0xff);
36                 l >>= 8;
37             }
38         }
39         return ret;
40     }
41 }
42