//This is my code (ignore the debug-output): private String decodeString(String encodedStuff) { byte[] encodedString = encodedStuff.getBytes(); byte[] decodedString = new byte[encodedString.length]; byte mask = '0'; int pos = 0; int dpos = 0; while (pos != encodedString.length) { if (pos % 8 == 0) { mask = encodedString[pos]; System.out.println("New Mask: " + mask); } else { byte b = encodedString[pos]; if ((mask & (0x1 << (pos % 8))) == 0) { System.out.println("decreasing"); decodedString[dpos++] = --b; } else { System.out.println("keeping"); decodedString[dpos++] = b; } System.out.println(new String(decodedString)); } pos++; } return new String(decodedString); } // This is the 'C' function that the documentation gives me as an example of how to decode: There are the GameSetting and three null-terminated strings here back-to-back, all encoded into a single null terminated string. (But we don't know the reason for this encoding!) Every even byte-value was incremented by 1. So all encoded bytes are odd. A control-byte stores the transformations for the next 7 bytes. Since all NullBytes were transformed to 1, they will never occure inside the encoded string. But a NullByte marks the end of the encoded string. The encoded string starts with a control byte. The control byte holds a bitfield with one bit for each byte of the next 7 bytes block. Bit 1 (not Bit 0) corresponds to the following byte right after the control-byte, bit 2 to the next, and so on. Only Bit 1-7 contribute to encoded string. Bit 0 is unused and always set. Decoding these bytes works as follows: If the corresponding bit is a '1' then the character is moved over directly. If the corresponding bit is a '0' then subtract 1 from the character. After a control-byte and the belonging 7 bytes follows a new control-byte until you find a NULL character in the stream. Example decompression code (in 'C'): char* EncodedString; char* DecodedString; char mask; int pos=0; int dpos=0; while (EncodedString[pos] != 0) { if (pos%8 == 0) mask=EncodedString[pos]; else { if ((mask & (0x1 << (pos%8))) == 0) DecodedString[dpos++] = EncodedString[pos] - 1; else DecodedString[dpos++] = EncodedString[pos]; } pos++; } // // This is the output I get: // Laqs]Envnload\DotA Allstars v7/59c.v3xMYM|LevenT // // This is what I approximately expect: // Maps\Download\DotA Allstars v.6.49b.w3gMYM|Levent