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.UrlTokenEncodeHttpServerUtility.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 友好字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串创建 SEO 友好的破折号分隔 url?

C# Byte[Hex] 数组到字符串 - 无转换

301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL

如何通过 C# 生成安全的 Base64 URL 字符串?

如何更改字符串以使其对 URL 友好? [复制]

如何在 C# 中实现 Base64 URL 安全编码?