2009-12-11 33 views
27

Tôi đang làm việc trên một trình tạo hình ảnh xác thực nhanh cho một trang web đơn giản mà tôi sắp xếp lại và tôi hy vọng sẽ chuyển một khóa được mã hóa vào url của trang. Tôi có thể có thể làm điều này như một tham số chuỗi truy vấn dễ dàng đủ, nhưng tôi hy vọng không quá (chỉ vì không có gì khác chạy ra khỏi chuỗi truy vấn) ...C# Byte [] đến Url Friendly String

Mã hóa của tôi tạo ra một byte [], sau đó chuyển đổi bằng cách sử dụng Convert.ToBase64String (byte []) thành một chuỗi. Chuỗi này, tuy nhiên, vẫn không khá thân thiện với url, vì nó có thể chứa những thứ như '/' và '='. Có ai biết về một chức năng tốt hơn trong khuôn khổ .NET để chuyển đổi một mảng byte vào một chuỗi thân thiện với url?

Tôi biết tất cả về System.Web.HttpUtility.UrlEncode() và tương đương của nó, tuy nhiên, chúng chỉ hoạt động đúng với thông số chuỗi truy vấn. Nếu tôi mã hóa url '=' bên trong đường dẫn, máy chủ web của tôi sẽ trả lại lỗi yêu cầu 400 lỗi.

Anyways, không phải là một vấn đề quan trọng, nhưng hy vọng ai đó có thể cho tôi một giải pháp tốt đẹp

** EDIT: Chỉ cần được hoàn toàn chắc chắn chính xác những gì tôi đang làm với chuỗi, tôi figured tôi sẽ cung cấp một chút thêm thông tin.

byte [] kết quả từ thuật toán mã hóa của tôi nên được cấp thông qua một số loại thuật toán để biến nó thành chuỗi thân thiện với url. Sau đó, nó trở thành nội dung của một XElement, sau đó được sử dụng làm tài liệu nguồn cho phép chuyển đổi XSLT, và được sử dụng như một phần của thuộc tính href cho một neo. Tôi không tin rằng việc chuyển đổi xslt gây ra sự cố, vì những gì đang diễn ra trên đường dẫn dường như là tham số chuỗi truy vấn được mã hóa nhưng gây ra HTTP 400

Tôi cũng đã thử HttpUtility.UrlPathEncode() trên một chuỗi base64, nhưng điều đó dường như không làm các trick trong hai (tôi vẫn kết thúc với '/' s trong url của tôi) **

Trả lời

82

Bạn đang tìm kiếm HttpServerUtility.UrlTokenEncodeHttpServerUtility.UrlTokenDecode, trong System.Web.

Chúng mã hóa trong base64, thay thế các ký tự '+' và '/' nguy hiểm tiềm ẩn nguy hiểm bằng '-' và '_' thay thế.

MSDN documentation

+1

Nghiêm túc? Tôi phải thử ngay bây giờ ... – LorenVS

+1

+1: Base64 là một mã hóa nhỏ gọn hơn là chỉ sử dụng các chữ số hex từ 'BitConverter.ToString'. – LukeH

+2

Làm việc như một sự quyến rũ ... Wicked (ít được biết đến) chức năng đó ... Cảm ơn người đàn ông – LorenVS

1

có một cái nhìn tại System.BitConverter.ToString(myByteArray)

Handy để mã hóa một cách cho những thứ như băm nhưng như được chỉ ra bởi ssg nó không phải là rất hiệu quả. Tôi sẽ không khuyên bạn nên nó cho một lượng lớn dữ liệu.

+0

tôi sẵn sàng đi đến Hex Encoding, nếu có một chức năng để đảo ngược hoạt động này ... – LorenVS

+0

để tham khảo, BitConverter.GetBytes() không có tình trạng quá tải mà phải mất một chuỗi – LorenVS

+0

Tìm thấy url này để tham khảo http://stackoverflow.com/questions/1230303/bitconverter-tostring-in-reverse sẽ chỉ sử dụng giải pháp này – LorenVS

0

nếu bạn đang làm việc trên một nhanh hình ảnh xác thực cho một trang web đơn giản bạn đang lắp ráp, tại sao bạn viết nó từ đầu thay vì sử dụng cái gì đó đã được thử nghiệm và thử nghiệm như recaptcha?

+0

b/c nó không phải là hoàn hảo ... Nó chỉ có để làm việc, và một điều giáo dục của nó.Tôi đã không bao giờ viết một captcha trước, con số nó sẽ có giá trị một shot ... Nó chỉ dành cho một trang web cá nhân, không có gì lạ mắt – LorenVS