Source Code Cross Referenced for binascii.java in  » Scripting » jython » org » python » modules » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Java Source Code / Java Documentation
1. 6.0 JDK Core
2. 6.0 JDK Modules
3. 6.0 JDK Modules com.sun
4. 6.0 JDK Modules com.sun.java
5. 6.0 JDK Modules sun
6. 6.0 JDK Platform
7. Ajax
8. Apache Harmony Java SE
9. Aspect oriented
10. Authentication Authorization
11. Blogger System
12. Build
13. Byte Code
14. Cache
15. Chart
16. Chat
17. Code Analyzer
18. Collaboration
19. Content Management System
20. Database Client
21. Database DBMS
22. Database JDBC Connection Pool
23. Database ORM
24. Development
25. EJB Server geronimo
26. EJB Server GlassFish
27. EJB Server JBoss 4.2.1
28. EJB Server resin 3.1.5
29. ERP CRM Financial
30. ESB
31. Forum
32. GIS
33. Graphic Library
34. Groupware
35. HTML Parser
36. IDE
37. IDE Eclipse
38. IDE Netbeans
39. Installer
40. Internationalization Localization
41. Inversion of Control
42. Issue Tracking
43. J2EE
44. JBoss
45. JMS
46. JMX
47. Library
48. Mail Clients
49. Net
50. Parser
51. PDF
52. Portal
53. Profiler
54. Project Management
55. Report
56. RSS RDF
57. Rule Engine
58. Science
59. Scripting
60. Search Engine
61. Security
62. Sevlet Container
63. Source Control
64. Swing Library
65. Template Engine
66. Test Coverage
67. Testing
68. UML
69. Web Crawler
70. Web Framework
71. Web Mail
72. Web Server
73. Web Services
74. Web Services apache cxf 2.0.1
75. Web Services AXIS2
76. Wiki Engine
77. Workflow Engines
78. XML
79. XML UI
Java
Java Tutorial
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
Photoshop Tutorials
Maya Tutorials
Flash Tutorials
3ds-Max Tutorials
Illustrator Tutorials
GIMP Tutorials
C# / C Sharp
C# / CSharp Tutorial
C# / CSharp Open Source
ASP.Net
ASP.NET Tutorial
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
Ruby
PHP
Python
Python Tutorial
Python Open Source
SQL Server / T-SQL
SQL Server / T-SQL Tutorial
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Flash / Flex / ActionScript
VBA / Excel / Access / Word
XML
XML Tutorial
Microsoft Office PowerPoint 2007 Tutorial
Microsoft Office Excel 2007 Tutorial
Microsoft Office Word 2007 Tutorial
Java Source Code / Java Documentation » Scripting » jython » org.python.modules 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


001:        /*
002:         * Copyright 1998 Finn Bock.
003:         *
004:         * This program contains material copyrighted by:
005:         * Copyright (c) 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
006:         * Amsterdam, The Netherlands.
007:         */
008:
009:        package org.python.modules;
010:
011:        import org.python.core.Py;
012:        import org.python.core.PyException;
013:        import org.python.core.PyObject;
014:        import org.python.core.PyString;
015:        import org.python.core.PyTuple;
016:
017:        /**
018:         * The <tt>binascii.java</tt> module contains a number of methods to convert
019:         * between binary and various ASCII-encoded binary
020:         * representations. Normally, you will not use these modules directly but
021:         * use wrapper modules like <tt>uu</tt><a name="l2h-"></a> or
022:         * <tt>hexbin</tt><a name="l2h-"></a> instead, this module solely
023:         * exists because bit-manipuation of large amounts of data is slow in
024:         * Python.
025:         *
026:         * <P>
027:         * The <tt>binascii.java</tt> module defines the following functions:
028:         * <P>
029:         * <dl><dt><b><a name="l2h-19960"><tt>a2b_uu</tt></a></b> (<var>string</var>)
030:         * <dd>
031:         * Convert a single line of uuencoded data back to binary and return the
032:         * binary data. Lines normally contain 45 (binary) bytes, except for the
033:         * last line. Line data may be followed by whitespace.
034:         * </dl>
035:         *
036:         * <P>
037:         * <dl><dt><b><tt>b2a_uu</tt></b> (<var>data</var>)
038:         * <dd>
039:         * Convert binary data to a line of ASCII characters, the return value
040:         * is the converted line, including a newline char. The length of
041:         * <i>data</i> should be at most 45.
042:         * </dl>
043:         *
044:         * <P>
045:         * <dl><dt><b><tt>a2b_base64</tt></b> (<var>string</var>)
046:         * <dd>
047:         * Convert a block of base64 data back to binary and return the
048:         * binary data. More than one line may be passed at a time.
049:         * </dl>
050:         *
051:         * <P>
052:         * <dl><dt><b><tt>b2a_base64</tt></b> (<var>data</var>)
053:         * <dd>
054:         * Convert binary data to a line of ASCII characters in base64 coding.
055:         * The return value is the converted line, including a newline char.
056:         * The length of <i>data</i> should be at most 57 to adhere to the base64
057:         * standard.
058:         * </dl>
059:         *
060:         * <P>
061:         * <dl><dt><b><tt>a2b_hqx</tt></b> (<var>string</var>)
062:         * <dd>
063:         * Convert binhex4 formatted ASCII data to binary, without doing
064:         * RLE-decompression. The string should contain a complete number of
065:         * binary bytes, or (in case of the last portion of the binhex4 data)
066:         * have the remaining bits zero.
067:         * </dl>
068:         *
069:         * <P>
070:         * <dl><dt><b><tt>rledecode_hqx</tt></b> (<var>data</var>)
071:         * <dd>
072:         * Perform RLE-decompression on the data, as per the binhex4
073:         * standard. The algorithm uses <tt>0x90</tt> after a byte as a repeat
074:         * indicator, followed by a count. A count of <tt>0</tt> specifies a byte
075:         * value of <tt>0x90</tt>. The routine returns the decompressed data,
076:         * unless data input data ends in an orphaned repeat indicator, in which
077:         * case the <tt>Incomplete</tt> exception is raised.
078:         * </dl>
079:         *
080:         * <P>
081:         * <dl><dt><b><tt>rlecode_hqx</tt></b> (<var>data</var>)
082:         * <dd>
083:         * Perform binhex4 style RLE-compression on <i>data</i> and return the
084:         * result.
085:         * </dl>
086:         *
087:         * <P>
088:         * <dl><dt><b><tt>b2a_hqx</tt></b> (<var>data</var>)
089:         * <dd>
090:         * Perform hexbin4 binary-to-ASCII translation and return the
091:         * resulting string. The argument should already be RLE-coded, and have a
092:         * length divisible by 3 (except possibly the last fragment).
093:         * </dl>
094:         *
095:         * <P>
096:         * <dl><dt><b><tt>crc_hqx</tt></b> (<var>data, crc</var>)
097:         * <dd>
098:         * Compute the binhex4 crc value of <i>data</i>, starting with an initial
099:         * <i>crc</i> and returning the result.
100:         * </dl>
101:         *
102:         * <dl><dt><b><tt>Error</tt></b>
103:         * <dd>
104:         * Exception raised on errors. These are usually programming errors.
105:         * </dl>
106:         *
107:         * <P>
108:         * <dl><dt><b><tt>Incomplete</tt></b>
109:         * <dd>
110:         * Exception raised on incomplete data. These are usually not programming
111:         * errors, but may be handled by reading a little more data and trying
112:         * again.
113:         * </dl>
114:         *
115:         * The module is a line-by-line conversion of the original binasciimodule.c
116:         * written by Jack Jansen, except that all mistakes and errors are my own.
117:         * <p>
118:         * @author Finn Bock, bckfnn@pipmail.dknet.dk
119:         * @version binascii.java,v 1.6 1999/02/20 11:37:07 fb Exp
120:
121:         */
122:        public class binascii {
123:
124:            public static String __doc__ = "Conversion between binary data and ASCII";
125:
126:            public static final PyString Error = new PyString("binascii.Error");
127:
128:            public static final PyString Incomplete = new PyString(
129:                    "binascii.Incomplete");
130:
131:            // hqx lookup table, ascii->binary.
132:            private static char RUNCHAR = 0x90;
133:
134:            private static short DONE = 0x7F;
135:            private static short SKIP = 0x7E;
136:            private static short FAIL = 0x7D;
137:
138:            private static short[] table_a2b_hqx = {
139:            /*       ^@    ^A    ^B    ^C    ^D    ^E    ^F    ^G   */
140:            /* 0*/FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
141:            /*       \b    \t    \n    ^K    ^L    \r    ^N    ^O   */
142:            /* 1*/FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
143:            /*       ^P    ^Q    ^R    ^S    ^T    ^U    ^V    ^W   */
144:            /* 2*/FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
145:            /*       ^X    ^Y    ^Z    ^[    ^\    ^]    ^^    ^_   */
146:            /* 3*/FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
147:            /*              !     "     #     $     %     &     '   */
148:            /* 4*/FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
149:            /*        (     )     *     +     ,     -     .     /   */
150:            /* 5*/0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
151:            /*        0     1     2     3     4     5     6     7   */
152:            /* 6*/0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
153:            /*        8     9     :     ;     <     =     >     ?   */
154:            /* 7*/0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
155:            /*        @     A     B     C     D     E     F     G   */
156:            /* 8*/0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
157:            /*        H     I     J     K     L     M     N     O   */
158:            /* 9*/0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
159:            /*        P     Q     R     S     T     U     V     W   */
160:            /*10*/0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
161:            /*        X     Y     Z     [     \     ]     ^     _   */
162:            /*11*/0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
163:            /*        `     a     b     c     d     e     f     g   */
164:            /*12*/0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
165:            /*        h     i     j     k     l     m     n     o   */
166:            /*13*/0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
167:            /*        p     q     r     s     t     u     v     w   */
168:            /*14*/0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
169:            /*        x     y     z     {     |     }     ~    ^?   */
170:            /*15*/FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
171:            /*16*/FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
172:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
173:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
174:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
175:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
176:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
177:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
178:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
179:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
180:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
181:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
182:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
183:                    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, };
184:
185:            private static byte[] table_b2a_hqx = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr"
186:                    .getBytes();
187:
188:            private static short table_a2b_base64[] = { -1, -1, -1, -1, -1, -1,
189:                    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
190:                    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
191:                    -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54,
192:                    55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, /* Note PAD->0 */
193:                    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
194:                    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
195:                    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
196:                    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1,
197:                    -1, -1 };
198:
199:            private static char BASE64_PAD = '=';
200:
201:            /* Max binary chunk size (76 char line) */
202:            private static int BASE64_MAXBIN = 57;
203:
204:            private static byte[] table_b2a_base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
205:                    .getBytes();
206:
207:            private static int[] crctab_hqx = { 0x0000, 0x1021, 0x2042, 0x3063,
208:                    0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a,
209:                    0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,
210:                    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339,
211:                    0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
212:                    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4,
213:                    0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf,
214:                    0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7,
215:                    0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
216:                    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886,
217:                    0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed,
218:                    0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,
219:                    0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
220:                    0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b,
221:                    0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,
222:                    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a,
223:                    0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4,
224:                    0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd,
225:                    0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9,
226:                    0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080,
227:                    0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
228:                    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f,
229:                    0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214,
230:                    0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e,
231:                    0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481,
232:                    0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799,
233:                    0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,
234:                    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c,
235:                    0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
236:                    0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,
237:                    0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8,
238:                    0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1,
239:                    0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,
240:                    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64,
241:                    0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e,
242:                    0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17,
243:                    0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, };
244:
245:            public static PyString __doc__a2b_uu = new PyString(
246:                    "(ascii) -> bin. Decode a line of uuencoded data");
247:
248:            /**
249:             * Convert a single line of uuencoded data back to binary and return the
250:             * binary data. Lines normally contain 45 (binary) bytes, except for the
251:             * last line. Line data may be followed by whitespace.
252:             */
253:            public static String a2b_uu(String ascii_data) {
254:                int leftbits = 0;
255:                int leftchar = 0;
256:
257:                StringBuffer bin_data = new StringBuffer();
258:
259:                char this _ch;
260:                int i;
261:
262:                int ascii_len = ascii_data.length() - 1;
263:
264:                int bin_len = (ascii_data.charAt(0) - ' ') & 077;
265:
266:                for (i = 0; bin_len > 0; i++, ascii_len--) {
267:                    this _ch = ascii_data.charAt(i + 1);
268:                    if (this _ch == '\n' || this _ch == '\r' || ascii_len <= 0) {
269:                        // Whitespace. Assume some spaces got eaten at
270:                        // end-of-line. (We check this later)
271:                        this _ch = 0;
272:                    } else {
273:                        // Check the character for legality
274:                        // The 64 in stead of the expected 63 is because
275:                        // there are a few uuencodes out there that use
276:                        // '@' as zero instead of space.
277:                        if (this _ch < ' ' || this _ch > (' ' + 64)) {
278:                            throw new PyException(Error, "Illegal char");
279:                        }
280:                        this _ch = (char) ((this _ch - ' ') & 077);
281:                    }
282:                    // Shift it in on the low end, and see if there's
283:                    // a byte ready for output.
284:                    leftchar = (leftchar << 6) | (this _ch);
285:                    leftbits += 6;
286:                    if (leftbits >= 8) {
287:                        leftbits -= 8;
288:                        bin_data.append((char) ((leftchar >> leftbits) & 0xff));
289:                        leftchar &= ((1 << leftbits) - 1);
290:                        bin_len--;
291:                    }
292:                }
293:                // Finally, check that if there's anything left on the line
294:                // that it's whitespace only.
295:                while (ascii_len-- > 0) {
296:                    this _ch = ascii_data.charAt(++i);
297:                    // Extra '@' may be written as padding in some cases
298:                    if (this _ch != ' ' && this _ch != '@' && this _ch != '\n'
299:                            && this _ch != '\r') {
300:                        throw new PyException(Error, "Trailing garbage");
301:                    }
302:                }
303:                return bin_data.toString();
304:            }
305:
306:            public static PyString __doc__b2a_uu = new PyString(
307:                    "(bin) -> ascii. Uuencode line of data");
308:
309:            /**
310:             * Convert binary data to a line of ASCII characters, the return value
311:             * is the converted line, including a newline char. The length of
312:             * <i>data</i> should be at most 45.
313:             */
314:            public static String b2a_uu(String bin_data) {
315:                int leftbits = 0;
316:                char this _ch;
317:                int leftchar = 0;
318:
319:                int bin_len = bin_data.length();
320:                if (bin_len > 45) {
321:                    // The 45 is a limit that appears in all uuencode's
322:                    throw new PyException(Error, "At most 45 bytes at once");
323:                }
324:
325:                StringBuffer ascii_data = new StringBuffer();
326:
327:                // Store the length */
328:                ascii_data.append((char) (' ' + (bin_len & 077)));
329:
330:                for (int i = 0; bin_len > 0 || leftbits != 0; i++, bin_len--) {
331:                    // Shift the data (or padding) into our buffer
332:                    if (bin_len > 0) // Data
333:                        leftchar = (leftchar << 8) | bin_data.charAt(i);
334:                    else
335:                        // Padding
336:                        leftchar <<= 8;
337:                    leftbits += 8;
338:
339:                    // See if there are 6-bit groups ready
340:                    while (leftbits >= 6) {
341:                        this _ch = (char) ((leftchar >> (leftbits - 6)) & 0x3f);
342:                        leftbits -= 6;
343:                        ascii_data.append((char) (this _ch + ' '));
344:                    }
345:                }
346:                ascii_data.append('\n'); // Append a courtesy newline
347:
348:                return ascii_data.toString();
349:            }
350:
351:            private static int binascii_find_valid(String s, int offset, int num) {
352:                int slen = s.length() - offset;
353:
354:                /* Finds & returns the (num+1)th
355:                 ** valid character for base64, or -1 if none.
356:                 */
357:
358:                int ret = -1;
359:
360:                while ((slen > 0) && (ret == -1)) {
361:                    int c = (int) s.charAt(offset);
362:                    short b64val = table_a2b_base64[c & 0x7f];
363:                    if (((c <= 0x7f) && (b64val != -1))) {
364:                        if (num == 0)
365:                            ret = c;
366:                        num--;
367:                    }
368:
369:                    offset++;
370:                    slen--;
371:                }
372:                return ret;
373:            }
374:
375:            public static PyString __doc__a2b_base64 = new PyString(
376:                    "(ascii) -> bin. Decode a line of base64 data");
377:
378:            /**
379:             * Convert a block of base64 data back to binary and return the
380:             * binary data. More than one line may be passed at a time.
381:             */
382:            public static String a2b_base64(String ascii_data) {
383:                int leftbits = 0;
384:                char this _ch;
385:                int leftchar = 0;
386:                int quad_pos = 0;
387:
388:                int ascii_len = ascii_data.length();
389:
390:                int bin_len = 0;
391:                StringBuffer bin_data = new StringBuffer();
392:
393:                for (int i = 0; ascii_len > 0; ascii_len--, i++) {
394:                    // Skip some punctuation
395:                    this _ch = ascii_data.charAt(i);
396:                    if ((int) this _ch > 0x7F || this _ch == '\r'
397:                            || this _ch == '\n' || this _ch == ' ')
398:                        continue;
399:
400:                    if (this _ch == BASE64_PAD) {
401:                        if (quad_pos < 2
402:                                || (quad_pos == 2 && binascii_find_valid(
403:                                        ascii_data, i, 1) != BASE64_PAD))
404:                            continue;
405:                        else {
406:                            // A pad sequence means no more input.
407:                            // We've already interpreted the data
408:                            // from the quad at this point.
409:                            leftbits = 0;
410:                            break;
411:                        }
412:                    }
413:
414:                    short this _v = table_a2b_base64[(int) this _ch];
415:                    if (this _v == -1)
416:                        continue;
417:
418:                    // Shift it in on the low end, and see if there's
419:                    // a byte ready for output.
420:                    quad_pos = (quad_pos + 1) & 0x03;
421:                    leftchar = (leftchar << 6) | (this _v);
422:                    leftbits += 6;
423:                    if (leftbits >= 8) {
424:                        leftbits -= 8;
425:                        bin_data.append((char) ((leftchar >> leftbits) & 0xff));
426:                        bin_len++;
427:                        leftchar &= ((1 << leftbits) - 1);
428:                    }
429:                }
430:                // Check that no bits are left
431:                if (leftbits != 0) {
432:                    throw new PyException(Error, "Incorrect padding");
433:                }
434:                return bin_data.toString();
435:            }
436:
437:            public static PyString __doc__b2a_base64 = new PyString(
438:                    "(bin) -> ascii. Base64-code line of data");
439:
440:            /**
441:             * Convert binary data to a line of ASCII characters in base64 coding.
442:             * The return value is the converted line, including a newline char.
443:             * The length of <i>data</i> should be at most 57 to adhere to the base64
444:             * standard.
445:             */
446:            public static String b2a_base64(String bin_data) {
447:                int leftbits = 0;
448:                char this _ch;
449:                int leftchar = 0;
450:
451:                StringBuffer ascii_data = new StringBuffer();
452:
453:                int bin_len = bin_data.length();
454:                if (bin_len > BASE64_MAXBIN) {
455:                    throw new PyException(Error,
456:                            "Too much data for base64 line");
457:                }
458:
459:                for (int i = 0; bin_len > 0; bin_len--, i++) {
460:                    // Shift the data into our buffer
461:                    leftchar = (leftchar << 8) | bin_data.charAt(i);
462:                    leftbits += 8;
463:
464:                    // See if there are 6-bit groups ready
465:                    while (leftbits >= 6) {
466:                        this _ch = (char) ((leftchar >> (leftbits - 6)) & 0x3f);
467:                        leftbits -= 6;
468:                        ascii_data.append((char) table_b2a_base64[this _ch]);
469:                    }
470:                }
471:                if (leftbits == 2) {
472:                    ascii_data
473:                            .append((char) table_b2a_base64[(leftchar & 3) << 4]);
474:                    ascii_data.append(BASE64_PAD);
475:                    ascii_data.append(BASE64_PAD);
476:                } else if (leftbits == 4) {
477:                    ascii_data
478:                            .append((char) table_b2a_base64[(leftchar & 0xf) << 2]);
479:                    ascii_data.append(BASE64_PAD);
480:                }
481:                ascii_data.append('\n'); // Append a courtesy newline
482:
483:                return ascii_data.toString();
484:            }
485:
486:            public static PyString __doc__a2b_hqx = new PyString(
487:                    "ascii -> bin, done. Decode .hqx coding");
488:
489:            /**
490:             * Convert binhex4 formatted ASCII data to binary, without doing
491:             * RLE-decompression. The string should contain a complete number of
492:             * binary bytes, or (in case of the last portion of the binhex4 data)
493:             * have the remaining bits zero.
494:             */
495:            public static PyTuple a2b_hqx(String ascii_data) {
496:                int leftbits = 0;
497:                char this _ch;
498:                int leftchar = 0;
499:
500:                boolean done = false;
501:
502:                int len = ascii_data.length();
503:
504:                StringBuffer bin_data = new StringBuffer();
505:
506:                for (int i = 0; len > 0; len--, i++) {
507:                    // Get the byte and look it up
508:                    this _ch = (char) table_a2b_hqx[ascii_data.charAt(i)];
509:                    if (this _ch == SKIP)
510:                        continue;
511:                    if (this _ch == FAIL) {
512:                        throw new PyException(Error, "Illegal char");
513:                    }
514:                    if (this _ch == DONE) {
515:                        // The terminating colon
516:                        done = true;
517:                        break;
518:                    }
519:
520:                    // Shift it into the buffer and see if any bytes are ready
521:                    leftchar = (leftchar << 6) | (this _ch);
522:                    leftbits += 6;
523:                    if (leftbits >= 8) {
524:                        leftbits -= 8;
525:                        bin_data.append((char) ((leftchar >> leftbits) & 0xff));
526:                        leftchar &= ((1 << leftbits) - 1);
527:                    }
528:                }
529:
530:                if (leftbits != 0 && !done) {
531:                    throw new PyException(Incomplete,
532:                            "String has incomplete number of bytes");
533:                }
534:
535:                return new PyTuple(new PyObject[] {
536:                        Py.java2py(bin_data.toString()),
537:                        Py.newInteger(done ? 1 : 0) });
538:            }
539:
540:            public static PyString __doc__rlecode_hqx = new PyString(
541:                    "Binhex RLE-code binary data");
542:
543:            /**
544:             * Perform binhex4 style RLE-compression on <i>data</i> and return the
545:             * result.
546:             */
547:            static public String rlecode_hqx(String in_data) {
548:                int len = in_data.length();
549:
550:                StringBuffer out_data = new StringBuffer();
551:
552:                for (int in = 0; in < len; in++) {
553:                    char ch = in_data.charAt(in);
554:                    if (ch == RUNCHAR) {
555:                        // RUNCHAR. Escape it.
556:                        out_data.append(RUNCHAR);
557:                        out_data.append(0);
558:                    } else {
559:                        // Check how many following are the same
560:                        int inend;
561:                        for (inend = in + 1; inend < len
562:                                && in_data.charAt(inend) == ch
563:                                && inend < in + 255; inend++)
564:                            ;
565:                        if (inend - in > 3) {
566:                            // More than 3 in a row. Output RLE.
567:                            out_data.append(ch);
568:                            out_data.append(RUNCHAR);
569:                            out_data.append((char) (inend - in));
570:                            in = inend - 1;
571:                        } else {
572:                            // Less than 3. Output the byte itself
573:                            out_data.append(ch);
574:                        }
575:                    }
576:                }
577:                return out_data.toString();
578:            }
579:
580:            public static PyString __doc__b2a_hqx = new PyString(
581:                    "Encode .hqx data");
582:
583:            /**
584:             * Perform hexbin4 binary-to-ASCII translation and return the
585:             * resulting string. The argument should already be RLE-coded, and have a
586:             * length divisible by 3 (except possibly the last fragment).
587:             */
588:            public static String b2a_hqx(String bin_data) {
589:                int leftbits = 0;
590:                char this _ch;
591:                int leftchar = 0;
592:
593:                int len = bin_data.length();
594:
595:                StringBuffer ascii_data = new StringBuffer();
596:
597:                for (int i = 0; len > 0; len--, i++) {
598:                    // Shift into our buffer, and output any 6bits ready
599:                    leftchar = (leftchar << 8) | bin_data.charAt(i);
600:                    leftbits += 8;
601:                    while (leftbits >= 6) {
602:                        this _ch = (char) ((leftchar >> (leftbits - 6)) & 0x3f);
603:                        leftbits -= 6;
604:                        ascii_data.append((char) table_b2a_hqx[this _ch]);
605:                    }
606:                }
607:                // Output a possible runt byte
608:                if (leftbits != 0) {
609:                    leftchar <<= (6 - leftbits);
610:                    ascii_data.append((char) table_b2a_hqx[leftchar & 0x3f]);
611:                }
612:                return ascii_data.toString();
613:            }
614:
615:            public static PyString __doc__rledecode_hqx = new PyString(
616:                    "Decode hexbin RLE-coded string");
617:
618:            /**
619:             * Perform RLE-decompression on the data, as per the binhex4
620:             * standard. The algorithm uses <tt>0x90</tt> after a byte as a repeat
621:             * indicator, followed by a count. A count of <tt>0</tt> specifies a byte
622:             * value of <tt>0x90</tt>. The routine returns the decompressed data,
623:             * unless data input data ends in an orphaned repeat indicator, in which
624:             * case the <tt>Incomplete</tt> exception is raised.
625:             */
626:            static public String rledecode_hqx(String in_data) {
627:                char in_byte, in_repeat;
628:
629:                int in_len = in_data.length();
630:                int i = 0;
631:
632:                // Empty string is a special case
633:                if (in_len == 0)
634:                    return "";
635:
636:                StringBuffer out_data = new StringBuffer();
637:
638:                // Handle first byte separately (since we have to get angry
639:                // in case of an orphaned RLE code).
640:                if (--in_len < 0)
641:                    throw new PyException(Incomplete);
642:                in_byte = in_data.charAt(i++);
643:
644:                if (in_byte == RUNCHAR) {
645:                    if (--in_len < 0)
646:                        throw new PyException(Incomplete);
647:                    in_repeat = in_data.charAt(i++);
648:
649:                    if (in_repeat != 0) {
650:                        // Note Error, not Incomplete (which is at the end
651:                        // of the string only). This is a programmer error.
652:                        throw new PyException(Error,
653:                                "Orphaned RLE code at start");
654:                    }
655:                    out_data.append(RUNCHAR);
656:                } else {
657:                    out_data.append(in_byte);
658:                }
659:
660:                while (in_len > 0) {
661:                    if (--in_len < 0)
662:                        throw new PyException(Incomplete);
663:                    in_byte = in_data.charAt(i++);
664:
665:                    if (in_byte == RUNCHAR) {
666:                        if (--in_len < 0)
667:                            throw new PyException(Incomplete);
668:                        in_repeat = in_data.charAt(i++);
669:
670:                        if (in_repeat == 0) {
671:                            // Just an escaped RUNCHAR value
672:                            out_data.append(RUNCHAR);
673:                        } else {
674:                            // Pick up value and output a sequence of it
675:                            in_byte = out_data.charAt(out_data.length() - 1);
676:                            while (--in_repeat > 0)
677:                                out_data.append(in_byte);
678:                        }
679:                    } else {
680:                        // Normal byte
681:                        out_data.append(in_byte);
682:                    }
683:                }
684:                return out_data.toString();
685:            }
686:
687:            public static PyString __doc__crc_hqx = new PyString(
688:                    "(data, oldcrc) -> newcrc. Compute hqx CRC incrementally");
689:
690:            /**
691:             * Compute the binhex4 crc value of <i>data</i>, starting with an initial
692:             * <i>crc</i> and returning the result.
693:             */
694:            public static int crc_hqx(String bin_data, int crc) {
695:                int len = bin_data.length();
696:                int i = 0;
697:
698:                while (len-- > 0) {
699:                    crc = ((crc << 8) & 0xff00)
700:                            ^ crctab_hqx[((crc >> 8) & 0xff)
701:                                    ^ bin_data.charAt(i++)];
702:                }
703:
704:                return crc;
705:            }
706:
707:            static long[] crc_32_tab = new long[] { 0x00000000L, 0x77073096L,
708:                    0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL,
709:                    0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
710:                    0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL,
711:                    0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L,
712:                    0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL,
713:                    0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L,
714:                    0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
715:                    0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL,
716:                    0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L,
717:                    0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL,
718:                    0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L,
719:                    0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
720:                    0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L,
721:                    0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L,
722:                    0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L,
723:                    0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L,
724:                    0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
725:                    0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L,
726:                    0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL,
727:                    0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L,
728:                    0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL,
729:                    0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
730:                    0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L,
731:                    0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL,
732:                    0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L,
733:                    0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL,
734:                    0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
735:                    0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL,
736:                    0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L,
737:                    0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L,
738:                    0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L,
739:                    0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
740:                    0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL,
741:                    0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L,
742:                    0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL,
743:                    0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L,
744:                    0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
745:                    0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L,
746:                    0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L,
747:                    0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL,
748:                    0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L,
749:                    0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
750:                    0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L,
751:                    0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL,
752:                    0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L,
753:                    0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L,
754:                    0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
755:                    0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L,
756:                    0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL,
757:                    0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L,
758:                    0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL,
759:                    0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
760:                    0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL,
761:                    0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L,
762:                    0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L,
763:                    0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL,
764:                    0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
765:                    0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL,
766:                    0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L,
767:                    0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL,
768:                    0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L,
769:                    0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
770:                    0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L,
771:                    0x5a05df1bL, 0x2d02ef8dL };
772:
773:            public static int crc32(String bin_data) {
774:                return crc32(bin_data, 0);
775:            }
776:
777:            public static int crc32(String bin_data, long crc) {
778:                int len = bin_data.length();
779:
780:                crc &= 0xFFFFFFFFL;
781:                crc = crc ^ 0xFFFFFFFFL;
782:                for (int i = 0; i < len; i++) {
783:                    char ch = bin_data.charAt(i);
784:                    crc = (int) crc_32_tab[(int) ((crc ^ ch) & 0xffL)]
785:                            ^ (crc >> 8);
786:                    /* Note:  (crc >> 8) MUST zero fill on left */
787:                    crc &= 0xFFFFFFFFL;
788:                }
789:                if (crc >= 0x80000000)
790:                    return -(int) (crc + 1 & 0xFFFFFFFF);
791:                else
792:                    return (int) (crc & 0xFFFFFFFF);
793:            }
794:
795:            private static char[] hexdigit = "0123456789abcdef".toCharArray();
796:
797:            public static PyString __doc__b2a_hex = new PyString(
798:                    "b2a_hex(data) -> s; Hexadecimal representation of binary data.\n"
799:                            + "\n"
800:                            + "This function is also available as \"hexlify()\".");
801:
802:            public static String b2a_hex(String argbuf) {
803:                int arglen = argbuf.length();
804:
805:                StringBuffer retbuf = new StringBuffer(arglen * 2);
806:
807:                /* make hex version of string, taken from shamodule.c */
808:                for (int i = 0; i < arglen; i++) {
809:                    char ch = argbuf.charAt(i);
810:                    retbuf.append(hexdigit[(ch >>> 4) & 0xF]);
811:                    retbuf.append(hexdigit[ch & 0xF]);
812:                }
813:                return retbuf.toString();
814:
815:            }
816:
817:            public static String hexlify(String argbuf) {
818:                return b2a_hex(argbuf);
819:            }
820:
821:            public static PyString a2b_hex$doc = new PyString(
822:                    "a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n"
823:                            + "\n"
824:                            + "hexstr must contain an even number of hex digits "
825:                            + "(upper or lower case).\n"
826:                            + "This function is also available as \"unhexlify()\"");
827:
828:            public static String a2b_hex(String argbuf) {
829:                int arglen = argbuf.length();
830:
831:                /* XXX What should we do about strings with an odd length?  Should
832:                 * we add an implicit leading zero, or a trailing zero?  For now,
833:                 * raise an exception.
834:                 */
835:                if (arglen % 2 != 0)
836:                    throw Py.TypeError("Odd-length string");
837:
838:                StringBuffer retbuf = new StringBuffer(arglen / 2);
839:
840:                for (int i = 0; i < arglen; i += 2) {
841:                    int top = Character.digit(argbuf.charAt(i), 16);
842:                    int bot = Character.digit(argbuf.charAt(i + 1), 16);
843:                    if (top == -1 || bot == -1)
844:                        throw Py.TypeError("Non-hexadecimal digit found");
845:                    retbuf.append((char) ((top << 4) + bot));
846:                }
847:                return retbuf.toString();
848:            }
849:
850:            public static String unhexlify(String argbuf) {
851:                return a2b_hex(argbuf);
852:            }
853:
854:            /*
855:             public static void main(String[] args) {
856:             String l = b2a_uu("Hello");
857:             System.out.println(l);
858:             System.out.println(a2b_uu(l));
859:
860:             l = b2a_base64("Hello");
861:             System.out.println(l);
862:             System.out.println(a2b_base64(l));
863:
864:             l = b2a_hqx("Hello-");
865:             System.out.println(l);
866:             System.out.println(a2b_hqx(l));
867:             }
868:             */
869:        }
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.