קידוד ופענוח של 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.


$config[zx-auto] not found$config[zx-overlay] not found