C# 从字节数组获取字符数组,然后返回字节数组

C# 从字节数组获取字符数组,然后返回字节数组,c#,bytearray,C#,Bytearray,我不知道为什么,但当你做下一件事时,你将永远不会得到与原始字节数组相同的结果: var b = new byte[] {252, 2, 56, 8, 9}; var g = System.Text.Encoding.ASCII.GetChars(b); var f = System.Text.Encoding.ASCII.GetBytes(g); 如果运行此代码,您将看到b!=f、 为什么?! 有没有办法将字节转换为字符,然后再转换回字节,得到与原始字节数组相同的结果?唯一的区别是第一个字节:

我不知道为什么,但当你做下一件事时,你将永远不会得到与原始字节数组相同的结果:

var b = new byte[] {252, 2, 56, 8, 9};
var g = System.Text.Encoding.ASCII.GetChars(b);
var f = System.Text.Encoding.ASCII.GetBytes(g);
如果运行此代码,您将看到b!=f、 为什么?!
有没有办法将字节转换为字符,然后再转换回字节,得到与原始字节数组相同的结果?

唯一的区别是第一个字节:252。因为ascii字符是1字节有符号字符,它的值范围是-128到127。实际上你的输入是错误的。有符号字符不能是252。

字节值可以是0到255

当字节值为127时,则

System.Text.Encoding.ASCII.GetChars()
始终是“?”,其值63

所以,

System.Text.Encoding.ASCII.GetBytes()
对于那些具有初始字节值的结果总是得到63(错误值)>127


如果您需要,那么您可以执行以下操作

        var b = new byte[] { 252, 2, 56, 8, 9 };
        //another encoding
        var e = Encoding.GetEncoding("437");
        //252 inside the mentioned table is ⁿ and now you have it
        var g = e.GetString(b);
        //now you can get the byte value 252
        var f = e.GetBytes(g);
你可以阅读类似的文章

为什么不使用字符

var b = new byte[] {252, 2, 56, 8, 9};
var g = new char[b.Length];
var f = new byte[g.Length]; // can also be b.Length, doens't really matter
for (int i = 0; i < b.Length; i++)
{
   g[i] = Convert.ToChar(b[i]);
}
for (int i = 0; i < f.Length; i++)
{
   f[i] = Convert.ToByte(g[i]);
}
varb=newbyte[]{252,2,56,8,9};
var g=新字符[b.长度];
var f=新字节[g.Length];//也可以是b。长度,没关系
for(int i=0;i
因为
252
不能用作ASCII字符(它是7位)。因此,在任意字节数组和字符串之间进行转换可能会有损。您想对字符做什么?@L.B我如何修复它?@AndrewMorton这有关系吗?@ZilbermanRafael使用
Convert.ToBase64String
Convert.FromBase64String
我不是在谈论实际的ascii。我说的是代码中的ascii码。我特意用这种方式写作,以便于理解。我知道没有所谓的ascii无符号字符。在c中,请参考答案@Adrian McCarthy,这里没有“负ascii”值。ASCII为0到127之间的值定义字符和控制代码。因此,您的答案在签名字符上有问题