Base64는 8 비트 바이트 코드를 전송하기위한 네트워크에서 가장 일반적인 인코딩 방법 중 하나입니다. 자세한 마임 사양이 포함 된 RFC2045 ~ RFC2049를 확인할 수 있습니다. Base64는 3 개의 8 비트 바이트를 4 개의 6 비트 바이트 (3*8 = 4*6 = 24)로 변환 한 다음 4 개의 8 비트 바이트를 형성하기 위해 2 개의 높은 0ss에서 6bit을 추가해야합니다. 다시 말해, 변환 된 문자열은 이론적으로 원래 문자열보다 1/3 더 길다.
php 함수 : base64_encode () 및 base64_decode ()
Base64 인코딩, 디코딩 원리
Base64 인코딩은 실제로 3 개의 8 비트 바이트를 4 개의 6 비트 바이트로 변환합니다. (3*8 = 4*6 = 24)이 4 개의 6 비트 바이트는 실제로 8 비트이지만, 더 높은 2 비트는 0으로 설정됩니다. 6 비트의 바이트 만 유효한 경우, 2 ~ 2에서 6 번째 파워에서 63의 값은 63의 값이 0이면, 즉, 63의 값은 63의 값입니다. (0 ~ 63).
실제로 ASCII 코드에는 0에서 63 사이의 보이지 않는 문자가 많이 있으므로 다른 매핑을 만들고 매핑 테이블은 다음과 같습니다.
'a'~ 'z'? ASCII (0 ~ 25)
'a'~ 'z'? ASCII (26 ~ 51)
'0'~ '9'? ASCII (52 ~ 61)
'?'? ASCII (62)
'/'? ASCII (63)
이렇게하면 3 개의 8 비트 바이트를 4 개의 가시 문자로 변환합니다.
바이트 분할의 구체적인 방법은 다음과 같습니다.
aaaaaabb cccdddd eeffffff // abcdef는 실제로 1 또는 0입니다. 명확하게 보려면 대신 abcdef를 사용하십시오.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
바이트 1 바이트 2 바이트 3
||
//
00AAAAA 00BBCCCC 00DDDEE 00FFFFFF
참고 : 위의 3 바이트 비트는 원래 텍스트이고, 다음 4 바이트는 Base64 인코딩이고, 처음 두 비트는 0입니다.
이 방법으로 분할 할 때 원본 텍스트의 바이트 수는 3의 배수가되어야합니다.이 조건을 충족 할 수없는 경우 모든 제로 바이트를 사용하십시오.
전환 할 때 Base64 인코딩이 = 부호로 대체되므로 일부 Base64 인코딩이 하나 또는 두 개의 동일한 부호로 끝납니다.
번들의 이유이지만 F (원점)가 원본 텍스트의 바이트 수를 나타내는 경우 F (남은)가 사용되기 때문에 최대 두 개의 동일한 부호가 있습니다.
그렇다면 테이블 나머지
f (남은) = f (원산지) 모드 3이 설정되었습니다.
따라서 F (남은)의 가능한 값은 0, 1, 2입니다.
n = [f (원산지) f (남은)] / 3 인 경우
f (남은) = 0 인 경우, 4*n 바이트베이스 64 인코딩으로 변환됩니다.
f (남은) = 1 인 경우, 문자 그럴 바이트가 2 개의 base64- 인코딩 바이트로 분할 될 수 있기 때문에
Base64를 4의 배수로 사용하므로 2 개의 동일한 부호가 보충되어야합니다.
F (남은) = 2 인 경우, 두 개의 원본 텍스트 바이트를 3 Base64- 인코딩 바이트로 분할 될 수 있으므로 유사하게
동일한 부호를 추가해야합니다.
Base64 인코딩 된 문자열의 끝에 0 ~ 2 개의 동일한 부호가 있습니다. 이러한 동일한 징후는 디코딩에 필요하지 않으므로 삭제할 수 있습니다.
네트워크가 가져 와서 게시 매개 변수 목록이 나열되면 '+'는 정상적으로 전송할 수 없으므로 '|'
이런 식으로 Base64로 인코딩 된 문자열은 '|'만 가지고 있습니다. 그리고 '/', 따라서 base64- 인코딩 된 문자열은 매개 변수 값이있는 매개 변수 목록으로 전송 될 수 있습니다.
===========================================================================================================================
다음은 외국인이 작성한 구현입니다.
패키지 com.meterware.httpunit;
/***********************************************************************************************************************
* $ id : base64.java, v 1.4 2002/12/24 15:17:17 Russgold Exp $
*
* Russell Gold의 Copyright (C) 2000-2002
*
*이 소프트웨어의 사본을 얻는 사람에게 무료로 허가가 부여됩니다.
* 제한없이 소프트웨어를 처리하기 위해 문서 파일 ( "소프트웨어")
* 소프트웨어의 사용, 복사, 수정, 병합, 출판, 배포, 하선 및/또는 판매 권한
* 소프트웨어가 제공되는 사람이 다음과 같은 조건에 따라 다음과 같은 조건에 따라
*
* 위의 저작권 통지 및이 권한 통지는 모든 사본 또는 실질적인 부분에 포함됩니다.
* 소프트웨어의.
*
* 소프트웨어는 어떤 종류의 보증없이 "있는대로"제공되며, 이에 국한되지 않는 것입니다.
* 상업성, 특정 목적에 대한 적합성 및 비방에 대한 보증. 어떠한 경우에도
* 저자 또는 저작권 보유자는 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을집니다.
* 계약, 불법 행위 또는 기타, 소프트웨어 또는 사용 또는 기타와 관련하여 또는 관련하여 발생하거나
* 소프트웨어 거래.
*
********************************************************************************************************************************************************************************************************************************************************,
/**
* Base 64 인코딩으로 오 센터로 변환 할 유틸리티 클래스.
*
* @author <a href = "mailto : [email protected]"> Russell Gold </a>
**/
공개 클래스 Base64 {최종 정적 문자열 encodingchar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; /*** 제공된 문자열과 동등한 기본 64 인코딩 된 인코딩 된 것을 반환합니다. * @param 소스를 인코딩 할 문자열 */ public static string encode (문자열 소스) {char [] sourceBytes = getPaddedBytes (source); int numgroups = (sourceBytes.length + 2) / 3; char [] targetBytes = 새로운 char [4]; char [] target = new char [4 * numgroups]; for (int group = 0; group <numgroups; group ++) {convert3to4 (sourceBytes, group*3, targetBytes); for (int i = 0; i <targetBytes.length; i ++) {target [i+4*group] = encodingchar.charat (TargetBytes [i]); }} int numpadbytes = sourceBytes.length- source.length (); for (int i = target.length -numpadbytes; i <target.length; i ++) target [i] = '='; 새 문자열 (대상)을 반환합니다. } private static char [] getPaddedBytes (문자열 소스) {char [] converted = source.tochararray (); int requiredlength = 3 * ((변환 .length+2) /3); char [] result = new char [필수 길이]; System.arrayCopy (변환, 0, result, 0, converted.length); 반환 결과; } private static void convert3to4 (char [] source, int sourceIndex, char [] target) {target [0] = (char) (source [sourceIndex] >> 2); target [1] = (char) (((소스 [SourceIndex] & 0x03) <<4) | (Source [SourceIndex+1] >> 4); target [2] = (char) (((소스 [SourceIndex+1] & 0x0f) <<2) | (Source [SourceIndex+2] >> 6); target [3] = (char) (Source [SourceIndex+2] & 0x3f); } /***베이스 64 인코딩 된 문자열에 해당하는 일반 텍스트를 반환합니다. * @Param 소스 A BASE 64 문자열 (4 자의 배수가 있어야 함) */ public static string decode (문자열 소스) {if (source.length ()%4! = 0) 새 runtimeexception ( "유효한 Base64 코드는 4 자의 배수 를가집니다"). int numgroups = source.length () / 4; int numextrabytes = source.endswith ( "==")? 2 : (source.endswith ( "=")? 1 : 0); 바이트 [] targetBytes = 새로운 바이트 [3*numgroups]; 바이트 [] SourceBytes = 새로운 바이트 [4]; for (int group = 0; group <numgroups; group ++) {for (int i = 0; i <sourceBytes.length; i ++) {sourceBytes [i] = (byte) math.max (0, encodingchar.indexof (4*group+i)); } convert4to3 (sourceBytes, targetBytes, group*3); } 새 문자열을 반환합니다 (TargetBytes, 0, TargetBytes.length -NumexTrabytes); } private static void convert4to3 (byte [] source, byte [] target, int targetIndex) {target [targetIndex] = (byte) ((소스 [0] <2) | (소스 [1] >> 4); 대상 [targetIndex+1] = (byte) (((소스 [1] & 0x0f) <<4) | (출처 [2] >> 2); target [targetindex+2] = (byte) (((소스 [2] & 0x03) <<6) | (소스 [3]); }}