קידוד ופענוח של Java Base64
1. סקירה כללית
במדריך זה אנו חוקרים את השירותים השונים המספקים פונקציונליות קידוד ופענוח Base64 בג'אווה.
אנו מתכוונים בעיקר להמחיש את ממשקי ה- API החדשים של Java 8 ואת ממשקי ה- API של השירות שיוצאים מ- Apache Commons.
2. ג'אווה 8 לבסיס 64
Java 8 הוסיפה סוף סוף יכולות Base64 ל- API הסטנדרטי. זה דרך java.util.Base64 מחלקת שירות.
נתחיל בבדיקת תהליך מקודד בסיסי.
2.1. Java 8 Basic Base64
המקודד הבסיסי שומר על דברים פשוטים ומקודד את הקלט כפי שהוא, ללא הפרדת קו.
הפלט ממופה לקבוצת תווים ב- A-Za-z0-9 + / ערכת תווים, והמפענח דוחה כל תו מחוץ לסט זה.
בואו קודם קידוד מחרוזת פשוטה:
מחרוזת originalInput = "קלט בדיקה"; מחרוזת encodedString = Base64.getEncoder (). EncodeToString (originalInput.getBytes ());
שימו לב כיצד אנו מאחזרים את ה- API המקודד המלא באמצעות ה- Simple getEncoder () שיטת השירות.
בואו כעת לפענח את המחרוזת חזרה לצורה המקורית:
בתים [] decodedBytes = Base64.getDecoder (). decode (encodedString); String decodedString = מחרוזת חדשה (decodedBytes);
2.2. קידוד Java 8 Base64 ללא ריפוד
בקידוד Base64, אורך המחרוזת המקודדת לפלט חייב להיות מכפל של שלוש. אם לא, הפלט יהיה מרופד בתווי פנקס נוספים (=).
עם הפענוח, תווי הריפוד הנוספים האלה יימחקו. כדי להתעמק בריפוד ב- Base64, עיין בתשובה מפורטת זו ב- Stack Overflow.
אם נצטרך דלג על ריפוד הפלט - אולי מכיוון שהמחרוזת המתקבלת לעולם לא תפענח בחזרה - אנחנו יכולים פשוט לבחור בכך קידוד ללא ריפוד:
מחרוזת encodedString = Base64.getEncoder (). WithoutPadding (). EncodeToString (originalInput.getBytes ());
2.3. קידוד URL של Java 8
קידוד כתובות אתרים דומה מאוד למקודד הבסיסי שעליו הסתכלנו לעיל. הוא משתמש בכתובת ה- URL ובשם הקובץ Safe Base64, ואינו מוסיף הפרדת שורות:
מחרוזת originalUrl = "//www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java"; מחרוזת encodedUrl = Base64.getUrlEncoder (). EncodeToString (originalURL.getBytes ());
פענוח מתרחש באותה צורה. ה getUrlDecoder () שיטת השירות מחזירה א java.util.Base64.Decoder המשמש לפענוח כתובת האתר:
בתים [] decodedBytes = Base64.getUrlDecoder (). פענוח (encodedUrl); מחרוזת decodedUrl = מחרוזת חדשה (decodedBytes);
2.4. קידוד Java 8 MIME
נתחיל ביצירת קלט MIME בסיסי לקידוד:
סטטי פרטית StringBuilder getMimeBuffer () {חיץ StringBuilder = StringBuilder חדש (); עבור (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } החזר מאגר; }
מקודד MIME מייצר פלט מקודד Base64 באמצעות האלף בית הבסיסי אך בפורמט ידידותי ל- MIME.
כל שורה בפלט לא יכולה להיות יותר מ 76 תווים ומסתיימת בהחזרת כרכרה ואחריה הזנת שורה (\ r \ n):
חיץ StringBuilder = getMimeBuffer (); בתים [] encodedAsBytes = buffer.toString (). getBytes (); מחרוזת encodedMime = Base64.getMimeEncoder (). EncodeToString (encodedAsBytes);
ה getMimeDecoder () שיטת השירות מחזירה א java.util.Base64.Decoder המשמש לאחר מכן בתהליך הפענוח:
בייט [] decodedBytes = Base64.getMimeDecoder (). decode (encodedMime); מחרוזת decodedMime = מחרוזת חדשה (decodedBytes);
3. קידוד / פענוח באמצעות קוד אפאצ'י קומונס
ראשית, עלינו להגדיר את התלות commons-codec ב- pom.xml:
commons-codec commons-codec 1.10
שים לב שנוכל לבדוק אם גרסאות חדשות יותר של הספרייה פורסמו ב- Maven Central.
ה- API העיקרי הוא ה- org.apache.commons.codec.binary.Base64 בכיתה, שניתן לפרמט אותה באמצעות קונסטרוקטורים שונים:
- Base64 (urlSafe בוליאני) יוצר את ה- API של Base64 על ידי שליטה במצב בטוח לכתובת URL - מופעל או מושבת.
- בסיס 64(int lineLength) יוצר את ה- API של Base64 במצב שאינו בטוח ב- URL ושולט באורך השורה (ברירת המחדל היא 76).
- Base64 (int lineLength, byte [] lineSeparator) יוצר את ה- API של Base64 על ידי קבלת מפריד שורה נוסף, שהוא כברירת מחדל CRLF ("\ r \ n").
לאחר יצירת ה- Base64 API, קידוד ופענוח הם די פשוטים:
מחרוזת originalInput = "קלט בדיקה"; Base64 base64 = Base64 חדש (); מחרוזת encodedString = מחרוזת חדשה (base64.encode (originalInput.getBytes ()));
ה לְפַעֲנֵחַ() שיטה של בסיס 64 מחלקה מחזירה את המחרוזת המפוענחת:
מחרוזת decodedString = מחרוזת חדשה (base64.decode (encodedString.getBytes ()));
אפשרות פשוטה נוספת היא באמצעות ה- API הסטטי של בסיס 64במקום ליצור מופע:
מחרוזת originalInput = "קלט בדיקה"; מחרוזת encodedString = מחרוזת חדשה (Base64.encodeBase64 (originalInput.getBytes ())); מחרוזת decodedString = מחרוזת חדשה (Base64.decodeBase64 (encodedString.getBytes ()));
4. המרת א חוּט אל א בתים מַעֲרָך
לפעמים, עלינו להמיר a חוּט אל א בתים []. הדרך הפשוטה ביותר לעשות זאת היא להשתמש חוּטgetBytes () שיטה:
מחרוזת originalInput = "קלט בדיקה"; בתים [] תוצאה = originalInput.getBytes (); assertEquals (originalInput.length (), result.length);
עדיף לספק קידוד גם כן ולא להיות תלוי בקידוד ברירת מחדל, מכיוון שהוא תלוי במערכת:
מחרוזת originalInput = "קלט בדיקה"; בייט [] תוצאה = originalInput.getBytes (StandardCharsets.UTF_16); assertTrue (originalInput.length () <result.length);
אם המחרוזת שלנו היא בסיס 64 מקודד, נוכל להשתמש הבסיס 64 מפענח:
מחרוזת originalInput = "dGVzdCBpbnB1dA =="; בתים [] תוצאה = Base64.getDecoder (). לפענח (קלט מקורי); assertEquals ("קלט בדיקה", מחרוזת חדשה (תוצאה));
אנחנו יכולים גם להשתמש נתונים מסוג ממיר parseBase64Binary () שיטה:
מחרוזת OriginalInput = "dGVzdCBpbnB1dA =="; בתים [] תוצאה = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("קלט בדיקה", מחרוזת חדשה (תוצאה));
לבסוף, אנו יכולים להמיר הקסדצימלי חוּט אל א בתים [] באמצעות ממיר נתונים מסוג שיטה:
מחרוזת originalInput = "7465737420696E707574"; בייט [] תוצאה = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("קלט בדיקה", מחרוזת חדשה (תוצאה));
5. מסקנה
מאמר זה הסביר את היסודות כיצד לבצע קידוד ופענוח Base64 בג'אווה באמצעות ממשקי ה- API החדשים שהוצגו ב- Java 8 וב- Apache Commons.
לבסוף, ישנם כמה ממשקי API נוספים שכדאי להזכיר, המספקים פונקציונליות דומה: java.xml.bind.DataTypeConverter עם printHexBinary ו parseBase64Binary.
ניתן למצוא קטעי קוד ב- GitHub.