2009-04-02 6 views
13

Base64 유효하지 않은 문자 오류가 계속 발생합니다.Base64 String throwing invalid character 오류

프로그램은 XML 파일을 가져 와서 문서로 내 보냅니다. 사용자가 원하면 파일을 압축합니다. 압축이 잘 작동하고 UTF-8로 인코딩되고 파일에 기록되는 Base64 String을 반환합니다.

내가 그것의 압축 여부를 확인해야하는 프로그램으로 문서를 다시로드의 시간이 코드는 단순히 경우 :

byte[] gzBuffer = System.Convert.FromBase64String(text); 
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray()); 

그것은이 GZip으로 압축 코드가 있는지 확인하기 위해 문자열의 시작을 확인 그 안에.

이제 모든 테스트가 작동합니다. 나는 문자열을 가져 와서 압축하고, 압축을 풀고 원본과 비교합니다. 문제는 ADO 레코드 집합에서 반환 된 문자열을 가져올 때입니다. 문자열은 파일에 쓰여진 것과 똑같습니다. (끝에 "\ 0"이 추가되었지만, 아무 것도하지 않더라도 여전히 찢어져 버린다고 생각합니다.) 나는 심지어 전체 문자열을 복사하여 테스트 방법에 붙여 넣고 압축/압축 해제합니다. 잘 작동합니다.

테스트는 통과하지만 코드는 똑같은 문자열을 사용하여 실패 할 것입니까? 유일한 차이점은 일반 문자열을 선언하고 그것을 전달하는 대신 레코드 세트에서 하나를 반환하는 것입니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

+0

Convert.FromBase64String에 전달하는 문자열의 예를 게시하면 도움이 될 것입니다 (예 : 호출하기 전에 Debug.Write를 직접 입력하면 출력되는 결과) –

+0

... even 첫 번째와 마지막 8 바이트 또는 문자열 길이를 게시 한 경우 해당 문자열이 올바른 형식인지 확인하기에 충분할 것입니다. –

+0

qGcAAB + LCA ... cAAA == 길이는 2376 자입니다. – Brandon

답변

15

당신은 문자열이 파일에 을 작성 정확히 무엇

말 (끝에 "\ 0"의 추가와 함께,하지만 난 아무것도 않는 생각하지 않습니다) . Convert.FromBase64String는 "\ 0"을 고려하지 않는 유효한 Base64로 문자가 될 수 있기 때문에 : 사실

, 그것은 무언가를 않습니다 ("Base64로 문자열에 잘못된 문자"그것은 FormatException을 던져 코드를 발생) .

byte[] data1 = Convert.FromBase64String("AAAA\0"); // Throws exception 
    byte[] data2 = Convert.FromBase64String("AAAA"); // Works 

해결책 : 제로 터미네이션을 제거하십시오. (어쩌면 .Trim("\0") 전화)

:

MSDN docs for Convert.FromBase64String는이 공백을 문자를 무시

의의 길이가 0 개 배수가 아닌 FormatException 때 발생합니다 말을

중 4

- 또는

s의 형식이 유효하지 않습니다. s는 기본이 아닌 64자를 포함하고 은 두 개의 패딩 문자보다 많거나 비 공백 문자는 패딩 문자 중 하나입니다.오름차순

기본 64 자리 숫자는 0에서 는 대문자, 소문자 'Z'에 'A' , 부호 'Z'에 'A'입니다 0 '에서'9 ', 기호는'+ '및'/ '입니다.

+0

나는 \ 0 끄기, 그것은 여전히 ​​던졌습니다. – Brandon

+0

그래도 FormatException이나 그 밖의 것을 던지나요? FromBase64String에 전달되는 정확한 문자열은 무엇입니까? –

+0

정확한 문자열은 게시하는 데 약간 시간이 걸립니다. 내가 알지 못하는 크기 제한이 있습니까? 유효하지만 유효합니다. Base64에서 허용되지 않는 문자를 검사했습니다. 시험이 잘 돌아가고있는 이유를 설명하지는 않았지만 아마도 잘못 잘라 냈을 수도 있습니다. – Brandon

3

null char이 허용되는지 여부는 해당 base64 코덱에 따라 결정됩니다. Base64 표준의 모호성 (신뢰할 수있는 정확한 사양이 없음)이 주어지면 많은 구현에서는이를 공백으로 무시합니다. 그리고 다른 사람들은 그것을 문제로보고 할 수 있습니다. 그리고 buggiest 것들은 알아 차리지 못할 것이고 행복하게 해독하려고 시도 할 것입니다. : -/

하지만 C# 구현은 (하나의 유효한 접근 방식입니다) 소리가 나지 않는 것처럼 들리므로, 제거하는 것이 도움이됩니다.

작은 추가 설명 : UTF-8은 필수 사항이 아니며 ISO-8859-x 별칭 Latin-x 및 7 비트 Ascii도 사용할 수 있습니다. 왜냐하면 Base64는 7 비트 ASCII 인코딩 호환 코드와 함께 작동하는 7 비트 하위 세트 만 사용하도록 특별히 설계 되었기 때문입니다.

0

문자열 끝에서 \ 0을 (를) 제거 할 수 없다면 인코딩 할 각 문자열에 고유 한 문자를 추가하고 디코딩 할 때 제거 할 수 있습니다.

0

문자열에서 Base64를 변환하는 것과 관련하여 하나의 전환점은 이전의 "data : image/jpg; base64"를 사용하는 변환 함수와 실제 데이터 만 허용한다는 것입니다.