summaryrefslogtreecommitdiff
path: root/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/rarfile/FileNameDecoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/rarfile/FileNameDecoder.java')
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/rarfile/FileNameDecoder.java76
1 files changed, 76 insertions, 0 deletions
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/rarfile/FileNameDecoder.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/rarfile/FileNameDecoder.java
new file mode 100644
index 0000000..999ad39
--- /dev/null
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/rarfile/FileNameDecoder.java
@@ -0,0 +1,76 @@
+/*
+ *
+ * Original author: alpha_lam
+ * Creation date: ?
+ *
+ * Source: $HeadURL$
+ * Last changed: $LastChangedDate$
+ *
+ *
+ * the unrar licence applies to all junrar source and binary distributions
+ * you are not allowed to use this source to re-create the RAR compression algorithm
+ *
+ * Here some html entities which can be used for escaping javadoc tags:
+ * "&": "&" or "&"
+ * "<": "&#060;" or "&lt;"
+ * ">": "&#062;" or "&gt;"
+ * "@": "&#064;"
+ */
+package org.fox.ttcomics2.junrar.rarfile;
+
+public class FileNameDecoder {
+ public static int getChar(byte[] name, int pos) {
+ return name[pos] & 0xff;
+ }
+
+ public static String decode(byte[] name, int encPos) {
+ int decPos = 0;
+ int flags = 0;
+ int flagBits = 0;
+
+ int low = 0;
+ int high = 0;
+ int highByte = getChar(name, encPos++);
+ StringBuffer buf = new StringBuffer();
+ while (encPos < name.length) {
+ if (flagBits == 0) {
+ flags = getChar(name, encPos++);
+ flagBits = 8;
+ }
+ switch (flags >> 6) {
+ case 0:
+ buf.append((char) (getChar(name, encPos++)));
+ ++decPos;
+ break;
+ case 1:
+ buf.append((char) (getChar(name, encPos++) + (highByte << 8)));
+ ++decPos;
+ break;
+ case 2:
+ low = getChar(name, encPos);
+ high = getChar(name, encPos + 1);
+ buf.append((char) ((high << 8) + low));
+ ++decPos;
+ encPos += 2;
+ break;
+ case 3:
+ int length = getChar(name, encPos++);
+ if ((length & 0x80) != 0) {
+ int correction = getChar(name, encPos++);
+ for (length = (length & 0x7f) + 2; length > 0 && decPos < name.length; length--, decPos++) {
+ low = (getChar(name, decPos) + correction) & 0xff;
+ buf.append((char) ((highByte << 8) + low));
+ }
+ } else {
+ for (length += 2; length > 0 && decPos < name.length; length--, decPos++) {
+ buf.append((char) (getChar(name, decPos)));
+ }
+ }
+ break;
+ }
+ flags = (flags << 2) & 0xff;
+ flagBits -= 2;
+ }
+ return buf.toString();
+ }
+}