C# 字节数组转换为 URL 友好字符串

11 浏览
0 Comments

C# 字节数组转换为 URL 友好字符串

我正在为一个简单的网站开发一个快速的验证码生成器,并希望在页面的URL中传递一个加密的密钥。我可以很容易地将它作为查询字符串参数来处理,但我希望不这样做(因为没有其他东西使用查询字符串)...

我的加密代码生成一个字节数组(byte[]),然后使用Convert.ToBase64String(byte[])将其转换为字符串。然而,这个字符串仍然不太友好,因为它可能包含'/'和'='等字符。有没有人知道在.NET框架中有更好的函数将字节数组转换为适合URL的字符串?

我知道System.Web.HttpUtility.UrlEncode()及其等效函数,但它们只能正确处理查询字符串参数。如果我在路径中对'='进行URL编码,我的Web服务器会返回400 Bad Request错误。

总之,这不是一个关键问题,但希望有人能给我一个好的解决方案。

**编辑:为了确保我对字符串的处理方式完全正确,我想提供更多信息。

从我的加密算法产生的字节数组应该通过某种算法转换为适合URL的字符串。之后,它成为XElement的内容,然后用作XSLT转换的源文档,并作为锚点的href属性的一部分。我不认为XSLT转换会引起问题,因为在路径上出现的内容似乎是一个经过编码的查询字符串参数,但却导致了HTTP 400错误。

我还尝试在Base64字符串上使用HttpUtility.UrlPathEncode(),但似乎也没有起作用(我的URL仍然包含'/'字符)**

0
0 Comments

C#中的Byte[]类型是表示字节数组的数据类型,而Url Friendly String是指在URL中使用的字符串,需要满足特定的编码规则。本文的问题是如何将C#的字节数组转换为Url Friendly String的字符串。

在ASP.NET Core 6.0及以上版本中,可以使用Microsoft.AspNetCore.WebUtilities.WebEncoders来解决这个问题。具体的解决方法如下:

首先,使用RandomNumberGenerator.GetBytes方法生成一个长度为64的字节数组。

然后,调用WebEncoders.Base64UrlEncode方法将字节数组编码为Url Friendly String格式的字符串。

最后,如果需要将Url Friendly String字符串解码为字节数组,可以调用WebEncoders.Base64UrlDecode方法。

需要注意的是,以上的解决方案是正确的,不建议使用其他的解码器。

下面是具体的代码示例:

using Microsoft.AspNetCore.WebUtilities;
using System.Security.Cryptography;
byte[] bytes = RandomNumberGenerator.GetBytes(64);
string encoded = WebEncoders.Base64UrlEncode(bytes);
byte[] decoded = WebEncoders.Base64UrlDecode(encoded);

通过以上的代码,我们可以方便地将C#的字节数组转换为Url Friendly String字符串,并且可以进行相应的解码操作。这样就可以在URL中使用这样的字符串了。

0
0 Comments

C#中将Byte[]转换为Url友好的字符串的问题是这样产生的:为了安全起见,将二进制数据编码为URL友好的字符串是很常见的需求。然而,C#中没有直接的方法来实现这一点。因此,开发人员不得不自己编写代码来执行此操作。

解决这个问题的方法是使用C#中的现有方法HttpServerUtility.UrlTokenEncodeHttpServerUtility.UrlTokenDecode。这些方法位于System.Web命名空间中,并使用base64编码将字节数组转换为URL友好的字符串。在这个过程中,它们还替换了可能导致问题的字符"+"和"/",将其分别替换为"-"和"_"。

这些方法的使用非常简单。开发人员只需将字节数组传递给HttpServerUtility.UrlTokenEncode方法,它将返回一个URL友好的字符串。同样,将这个字符串传递给HttpServerUtility.UrlTokenDecode方法,它将返回原始的字节数组。

这些方法的好处是它们生成的URL友好的字符串比使用BitConverter.ToString方法直接将字节数组转换为十六进制字符串更紧凑。这使得它们非常适合在URL中传输二进制数据。

这些方法的存在很大程度上得益于微软的文档和开发人员的共享经验。有人在使用这些方法时遇到了问题,并将其解决方案分享给其他人。这表明了开发人员社区的力量和互相学习的重要性。

然而,这些方法也有一些限制。使用HttpServerUtility.UrlTokenEncode方法编码字节数组时,它会在生成的字符串的末尾添加一个数字,该数字表示删除的"="号的数量。这可能会导致一些问题,特别是在解码时。为了解决这个问题,开发人员需要使用其他方法来处理这个数字,并正确解码字节数组。

总之,将Byte[]转换为Url友好的字符串是一个常见的需求,但C#中没有直接的方法来实现它。通过使用HttpServerUtility.UrlTokenEncodeHttpServerUtility.UrlTokenDecode方法,开发人员可以很容易地将字节数组编码为URL友好的字符串,并在需要时解码它们。然而,开发人员需要注意解码时可能出现的一些问题,并根据需要进行处理。这些方法的存在是开发人员社区的力量和共享经验的一个例子。

0
0 Comments

问题:如何将C#的Byte[]转换为URL友好的字符串?

原因:根据给出的参考链接,System.BitConverter.ToString(myByteArray)方法可以将Byte[]转换为字符串,但是效率较低,不适合处理大量数据。另外,BitConverter.GetBytes()方法没有重载可以接受字符串作为参数。

解决方法:可以使用Hex Encoding来实现Byte[]到URL友好字符串的转换。首先将Byte[]转换为十六进制字符串,然后可以使用以下方法将十六进制字符串转换为URL友好的字符串:

public static string ToUrlFriendlyString(byte[] byteArray)
{
    StringBuilder sb = new StringBuilder(byteArray.Length * 2);
    foreach (byte b in byteArray)
    {
        sb.Append(b.ToString("X2"));
    }
    return sb.ToString();
}

需要注意的是,这种方法对于传输二进制数据效率较低。相比Base64编码方式,数据增长300%而不是130%。

参考链接:[stackoverflow.com/questions/1230303](http://stackoverflow.com/questions/1230303)

0