2009-04-02 42 views
13

Tôi tiếp tục nhận được một lỗi ký tự không hợp lệ Base64 mặc dù tôi không nên.Base64 Chuỗi ném lỗi ký tự không hợp lệ

Chương trình có tệp XML và xuất tệp đó vào tài liệu. Nếu người dùng muốn, nó cũng sẽ nén tệp. Nén hoạt động tốt và trả về một chuỗi Base64 được mã hóa thành UTF-8 và được ghi vào một tệp.

Khi thời gian của mình để tải lại tài liệu vào chương trình tôi phải kiểm tra xem nén của nó hay không, mã đơn giản là:

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

Nó kiểm tra đầu của chuỗi để xem nếu nó có GZips đang trong đó.

Hiện tại, tất cả các thử nghiệm của tôi đều hoạt động. Tôi lấy một chuỗi, nén nó, giải nén nó và so sánh nó với bản gốc. Vấn đề là khi tôi nhận được chuỗi trả về từ một Recordset ADO. Chuỗi là chính xác những gì đã được ghi vào tập tin (với việc bổ sung một "\ 0" ở cuối, nhưng tôi không nghĩ rằng thậm chí làm bất cứ điều gì, thậm chí cắt nó vẫn ném). Tôi thậm chí sao chép và dán toàn bộ chuỗi vào một phương pháp thử nghiệm và nén/giải nén đó. Hoạt động tốt.

Các thử nghiệm sẽ vượt qua nhưng mã sẽ không sử dụng cùng một chuỗi chính xác? Sự khác biệt duy nhất là thay vì chỉ tuyên bố một chuỗi thông thường và chuyển nó vào trong một cái tôi được trả về từ một recordset.

Bất kỳ ý tưởng nào về những gì tôi đang làm sai?

+0

Nó có lẽ sẽ giúp nếu bạn đăng một ví dụ về một chuỗi mà bạn đang đi đến Convert.FromBase64String (ví dụ như những gì bạn nhận được trên đầu ra nếu bạn đặt Debug.Write trực tiếp trước cuộc gọi) –

+0

... thậm chí nếu bạn đăng 8 byte đầu tiên và cuối cùng, và độ dài chuỗi, có thể là đủ để thấy rằng chuỗi là định dạng đúng. –

+0

qGcAAB + LCA ... cAAA == Dài 2376 ký tự. – Brandon

Trả lời

15

Bạn nói

Chuỗi là chính xác những gì đã được viết đến tập tin (với việc bổ sung một "\ 0" ở cuối, nhưng tôi không nghĩ rằng rằng ngay cả bất cứ điều gì) .

Trong thực tế, nó không làm điều gì đó (nó gây ra mã của bạn để ném một FormatException: "nhân vật không hợp lệ trong một chuỗi Base64") vì Convert.FromBase64String không xem xét "\ 0" là một nhân vật Base64 hợp lệ .

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

Giải pháp: Loại bỏ chấm dứt bằng 0. (Có thể gọi .Trim("\0"))

Ghi chú:

Các MSDN docs for Convert.FromBase64String nói nó sẽ ném một FormatException khi

Chiều dài của s, bỏ qua khoảng trắng nhân vật, không phải là không hay một bội số trong số 4.

-hoặc-

Định dạng của s không hợp lệ. s chứa ký tự 64 không phải cơ sở, nhiều hơn so với hai ký tự đệm hoặc ký tự khoảng trắng trong số các ký tự đệm .

Các cơ sở 64 chữ số theo thứ tự tăng dần từ zero là ký tự chữ hoa 'A' đến 'Z', ký tự chữ thường 'a' đến 'z', chữ số ' 0 'đến' 9 'và ký hiệu' + 'và'/'.

+0

Tôi cắt \ 0 off, nó vẫn ném. – Brandon

+0

Nó vẫn ném một FormatException, hoặc cái gì khác? Chuỗi chính xác được chuyển đến FromBase64String là gì? –

+0

Chuỗi chính xác dài một chút để đăng. Có giới hạn kích thước mà tôi không biết? Những gì là có giá trị mặc dù, tôi đã kiểm tra nó cho bất kỳ ký tự không được phép trong Base64. Có lẽ tôi đã làm sai trang trí, mặc dù nó không giải thích tại sao các bài kiểm tra đang chạy tốt. – Brandon

3

Cho dù thẻ không được phép hay không thực sự phụ thuộc vào codec base64 được đề cập. Với sự mơ hồ của tiêu chuẩn Base64 (không có đặc tả chính xác), nhiều triển khai sẽ chỉ bỏ qua nó là không gian trắng. Và sau đó những người khác có thể gắn cờ đó là một vấn đề. Và những người buggiest sẽ không chú ý và vui vẻ sẽ giải mã nó ...: -/

Nhưng nó thực sự không thực hiện nó (vì đó là một cách tiếp cận hợp lệ) nên nếu loại bỏ nó sẽ giúp.

Một nhận xét bổ sung nhỏ: UTF-8 không phải là yêu cầu, ISO-8859-x còn gọi là Latin-x và 7-bit Ascii cũng sẽ hoạt động. Điều này bởi vì Base64 được thiết kế đặc biệt để chỉ sử dụng tập con 7 bit làm việc với tất cả các mã hóa tương thích ascii 7 bit.

0

Nếu xóa \ 0 từ cuối chuỗi là không thể, bạn có thể thêm ký tự của riêng bạn cho mỗi chuỗi bạn mã hóa và loại bỏ nó trên giải mã.

0

Một lưu ý cần thực hiện khi chuyển đổi Base64 từ chuỗi là một số hàm chuyển đổi sử dụng "dữ liệu: hình ảnh/jpg; base64" trước đó và những người khác chỉ chấp nhận dữ liệu thực tế.

Các vấn đề liên quan