我正在将byte[]转换为字符串并返回. 转换回的字节[]与原始字节不相同.

How do I convert bytes to string and back correctly?

一个控制台应用程序来说明这一点: Program.cs

_ = new TestByteConversion();

TestByteConversion.cs

internal class TestByteConversion
{
    public TestByteConversion()
    {
        var aes = Aes.Create();
        aes.GenerateKey();
        var keyAsString = GetKeyAsString(aes.Key);

        // I save it in a key value pair as string.
        // I get the value as string from dictionary.
        var keyAsyBytes = GetKeyFromString(keyAsString);

        // USE NuGet ConsoleTables !
        var table = new ConsoleTable("ID", "origin", "char", "new value");

        for (var i = 0; i < keyAsString.Length; i++)
        {
            table.AddRow(i, aes.Key[i], keyAsString[i], keyAsyBytes[i]);
        }

        table.Write();
    }

    public static byte[] GetKeyFromString(string keyAsString)
    {
        return Encoding.ASCII.GetBytes(keyAsString);
    }

    public static string GetKeyAsString(byte[] byteArray)
    {
        return Encoding.ASCII.GetString(byteArray);
    }
}

推荐答案

来自ASCIIEncoding.GetString个文档:

ASCIEncoding不提供错误检测.任何大于十六进制0x7F的字节都被解码为Unicode问号("?").

0x7F是127,而字节最多是255,因此如果键有任何大于0x7F的元素,您将最终进行不可逆转换.

您可以使用Convert.ToBase64String/Convert.FromBase64String方法(或Convert.ToHexString/Convert.FromHexString).例如:

var array = Enumerable.Range(0, 256)
    .Select(i => (byte)i)
    .ToArray();
var s = Convert.ToHexString(array);
var bytes = Convert.FromHexString(s);
var sequenceEqual = bytes.SequenceEqual(array);
Console.WriteLine(sequenceEqual); prints "True"

Csharp相关问答推荐

IComponition.获取IReadOnlyCollection的返回默认属性值

在Linq中调用需要limit和offset的方法''''

始终保留数组中的最后N个值,丢弃最老的

如果属性名为xyz,我需要使用System.Text.Json修改字符串类型的值""<>

当通过Google的Gmail Api发送邮件时,签名会产生dkim = neutral(正文散列未验证)'

Blazor Foreach仅渲染最后一种 colored颜色

C#.NET依赖项注入顺序澄清

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

如何在C#中创建VS代码中的控制台应用程序时自动生成Main方法

如何向事件添加成员

是否由DI容器自动处理由ActivatorUilties.CreateInstance()创建的服务?

用C#从XML内部元素中获取特定值

Foreach非常慢的C#

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

如何从SignalR获取连接客户端的域

从HTML元素获取 colored颜色

用于分钟和秒验证的MudTextfield的正则表达式掩码

S,在.NET核心控制台应用程序中,AddScope和AddSingleton有什么不同?

如何使用moq和xUnit对删除操作进行单元测试?

LINQ在GROUP BY和JOIN之后获取子列表