DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Katarina has posted 8 posts at DZone. View Full User Profile

To Pack 8bit To 7bit Hex

08.28.2010
| 5422 views |
  • submit to reddit
        // description of your code here

public static byte[] getSeptets(byte[] octetBytes, boolean hasUDH) throws IOException {
	byte[] compressedData = null;
	try {
		ByteArrayOutputStream bas = new ByteArrayOutputStream();
		int userDataHeaderLen = 0;
		int padBits = 0;
		int userDataLen = octetBytes.length;

		if (hasUDH) {
			userDataHeaderLen = (octetBytes[0] & 0xFF) + 1; // plus 1 za
			// prvi byte
			// duzine
			bas.write(octetBytes, 0, userDataHeaderLen);

			userDataLen = octetBytes.length - userDataHeaderLen;
			padBits = (userDataHeaderLen * 8) % 7;
			if (padBits != 0)
				padBits = 7 - padBits;
		}

		byte pack[] = pack(octetBytes, userDataHeaderLen, userDataLen, padBits);
		bas.write(pack, 0, pack.length);

		compressedData = bas.toByteArray();

	} catch (Throwable e) {
		throw new IOException("Exception in (8bit to 7bit Hex conversion)", e);
	}

	return compressedData;
}

public static byte[] pack(byte[] ba) {
	return pack(ba, 0, ba.length, 0);
}

public static byte[] pack(byte[] ba, int off, int len, int pad) {
	String m1 = "", m2 = "";

	for (int i = 0; i < pad; i++)
		m1 += "0";
	for (int i = off; i < off + len; i++)
		m1 = zeroPad(Integer.toBinaryString(ba[i] & 0x7F), 7) + m1;
	if (m1.length() % 8 != 0)
		m1 = zeroPad(m1, m1.length() + (8 - m1.length() % 8));
	for (int i = 0; i < m1.length(); i += 8) {
		int b = Integer.parseInt(m1.substring(i, i + 8), 2);
		m2 = zeroPad(Integer.toHexString(b).toUpperCase(), 2) + m2;
	}
	return fromHexString(m2);
}

public static byte[] unpack(byte[] ba, int unpack_len) {
	return unpack(ba, 0, ba.length, 0, unpack_len);
}

public static byte[] unpack(byte[] ba, int off, int len, int pad, int unpack_len) {
	String m1 = "", m2 = "";
	for (int i = off; i < off + len; i++) {
		m1 = zeroPad(Integer.toBinaryString(ba[i] & 0xFF), 8) + m1;
	}
	m1 = m1.substring(0, m1.length() - pad);
	m1 = m1.substring(m1.length() % 7);
	for (int i = 0; i < m1.length(); i += 7) {
		int b = Integer.parseInt(m1.substring(i, i + 7), 2);
		m2 = zeroPad(Integer.toHexString(b).toUpperCase(), 2) + m2;
	}
	m2 = m2.substring(0, unpack_len * 2);
	return fromHexString(m2);
}

private static String zeroPad(String s, int p) {
	while (s.length() < p)
		s = "0" + s;
	return s;
}
    

Comments

Mlungisi Sincuba replied on Fri, 2011/12/02 - 4:31am

I could not use the code shown above. I ended up creating my own from scratch found on this blog post

Mlungisi Sincuba replied on Fri, 2011/12/02 - 4:31am

I could not use the code shown above. I ended up creating my own from scratch found on "http://mlusincuba.wordpress.com/2011/12/01/gsm-7-bit-encodingdecoding-used-for-sms-and-ussd-strings-java-code/"