C# Byte[] 到 URL 友好字符串
Posted
技术标签:
【中文标题】C# Byte[] 到 URL 友好字符串【英文标题】:C# Byte[] to Url Friendly String 【发布时间】:2010-12-25 14:15:06 【问题描述】:我正在为我正在整理的一个简单网站开发一个快速验证码生成器,我希望在页面的 url 中传递一个加密密钥。我可以很容易地把它作为一个查询字符串参数来做,但我希望不要太容易(只是因为没有其他东西从查询字符串中运行)......
我的加密代码生成一个字节[],然后使用 Convert.ToBase64String(byte[]) 将其转换为字符串。然而,这个字符串仍然对 url 不太友好,因为它可以包含诸如 '/' 和 '=' 之类的东西。有谁知道 .NET 框架中有一个更好的函数来将字节数组转换为 url 友好的字符串?
我对 System.Web.HttpUtility.UrlEncode() 及其等价物了如指掌,但是,它们仅适用于查询字符串参数。如果我在路径中对 '=' 进行 url 编码,我的网络服务器会返回 400 Bad Request 错误。
无论如何,不是关键问题,但希望有人能给我一个好的解决方案
**编辑:为了绝对确定我正在对字符串做什么,我想我会提供更多信息。
我的加密算法产生的 byte[] 应该通过某种算法输入,以使其成为 url 友好的字符串。此后,它成为 XElement 的内容,然后用作 XSLT 转换的源文档,并用作锚点的 href 属性的一部分。我不相信 xslt 转换会导致问题,因为路径上的内容似乎是编码的查询字符串参数,但会导致 HTTP 400
我也尝试过在 base64 字符串上使用 HttpUtility.UrlPathEncode(),但这似乎也不起作用(我的 url 中仍然有 '/')**
【问题讨论】:
【参考方案1】:您在System.Web
中寻找HttpServerUtility.UrlTokenEncode
和HttpServerUtility.UrlTokenDecode
。
它们以 base64 编码,将潜在危险的“+”和“/”字符替换为“-”和“_”。
MSDN documentation
【讨论】:
+1:Base64 是一种比仅使用来自BitConverter.ToString
的十六进制数字更紧凑的编码。
工作就像一个魅力......邪恶(鲜为人知)的功能......谢谢男人
@LorenVS - 当然。我也不知道它在那里,直到我们在工作中偶然发现它并用它替换了我们自己的实现。
微软选择将它放在System.Web
程序集中是多么令人讨厌。叹息。
谨慎使用,因为 UrlTokenEncode 在末尾添加了一个数字,表示已删除的 = 符号的数量。在此处查看可能的解决方案link【参考方案2】:
看看System.BitConverter.ToString(myByteArray)
对于像哈希这样的东西的一种编码方式很方便,但正如 ssg 所指出的那样,它不是很有效。对于大量数据,我不推荐它。
【讨论】:
我愿意去Hex Encoding,如果有反转这个操作的功能... 作为参考,BitConverter.GetBytes() 没有采用字符串的重载 找到这个网址供参考 ***.com/questions/1230303/… 只会使用这个解决方案 您需要记住,这对于传输二进制数据非常低效。数据以这种方式增长 300%,而不是像 base64 那样增长 130%。 @orip:没错。我想到了带有连字符的原始形式。以上是关于C# Byte[] 到 URL 友好字符串的主要内容,如果未能解决你的问题,请参考以下文章