C# 将字符串转换为字节数组,反之亦然

C# 将字符串转换为字节数组,反之亦然,c#,encoding,C#,Encoding,将字符串转换为字节数组,然后再向后更改,有时不会返回相同的字符串: RandomNumberGenerator gen = new RNGCryptoServiceProvider(); byte[] randomBytes = new byte[32]; gen.GetBytes(randomBytes); 在某些情况下(或unicode以外的任何编码): 我想知道如何使用这种方法,并得到同样的结果。 提前感谢您可能不是在寻找文本编码,而是在寻找序列化格式。文本编码用于文本。您正在处理的字节

将字符串转换为字节数组,然后再向后更改,有时不会返回相同的字符串:

RandomNumberGenerator gen = new RNGCryptoServiceProvider();
byte[] randomBytes = new byte[32];
gen.GetBytes(randomBytes);
在某些情况下(或unicode以外的任何编码):

我想知道如何使用这种方法,并得到同样的结果。
提前感谢

您可能不是在寻找文本编码,而是在寻找序列化格式。文本编码用于文本。您正在处理的字节是随机字节


Base64(
Convert.ToBase64String
)适合您吗

您还可以将字节塞入字符(
newstring(myBytes.Select(b=>(char)b.ToArray())
)。这将产生不可读的字符串,这些字符串很容易被其他系统损坏。可能不是正确的路径。

任意字节数组不需要对有效的Unicode字符串进行编码(有关详细信息,请参阅),例如

结果:

before: a6 dd
after:  fd ff
如果要生成这些字符串,可以将代码修改为

while (true) {
  using (RandomNumberGenerator gen = new RNGCryptoServiceProvider()) {
    byte[] randomBytes = new byte[32];
    gen.GetBytes(randomBytes);

    byte[] after = Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(randomBytes));

    if (!randomBytes.SequenceEqual(after)) {
      Console.Write(string.Join(" ", randomBytes) + 
                    Environment.NewLine + 
                    string.Join(" ", after));

      break;
    }
  }
}
可能的结果:

166 8 99 175 188 233 240 219 64 143 26 87 157 209 205 219 27 169 239 67 99 170 172 226 254 56 168 168 64 222 178 15
166 8 99 175 188 233 253 255 64 143 26 87 157 209 253 255 27 169 239 67 99 170 172 226 254 56 168 168 253 255 178 15
                     ^
                     Difference
请注意,我们应该将数组与
SequenceEqual
进行比较

如果要对数组进行编码,可以借助
string.Join

byte[] array = ...

// Something like "166 8 99 175 188 233 240 219 ... 64 222 178 15"
string encoded = string.Join(" ", array);

byte[] back = encoded
  .Split(' ')
  .Select(item => byte.Parse(item))
  .ToArray();

你真的在使用
=
是否比较字节数组?
Convert.ToBase64String
返回一个字符串。我需要将字符串转换为字节[]并返回。我正在使用
NetworkStream
类来传输字符串,它需要一个字节[]。@idotalker为什么要使用字符串?你有字节,你想要字节。直接发送字节。如果您的协议是基于文本的,那么您可能需要使用bas64转到字符串,然后使用UTF8之类的编码转到字节。这将适用于随机数据。没有base64就不会了。我想我可能有点不清楚。本文中的示例不是我正在使用的代码,我写它是为了说明
Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(randomBytes))
有时与
randomBytes
不同。我不想处理随机数据。我的输入是一个字符串,需要与
NetworkStream
一起发送。如下所示:
input(string)=>encryption=>Send(NetworkStream)
然后
receive(NetworkStream)=>decryption=>put string to use
。字节[]运行正常,但由于
编码
改变了它,因此解密无法工作。为什么不能完全使用字节操作?没有任何条件。无论如何,加密不会对文本进行操作。它以字节为单位进行操作@idotalker我的观点并不取决于数据的随机性。我的观点是,如果你有任意字节,你就不能使用编码从它们中生成文本。
166 8 99 175 188 233 240 219 64 143 26 87 157 209 205 219 27 169 239 67 99 170 172 226 254 56 168 168 64 222 178 15
166 8 99 175 188 233 253 255 64 143 26 87 157 209 253 255 27 169 239 67 99 170 172 226 254 56 168 168 253 255 178 15
                     ^
                     Difference
byte[] array = ...

// Something like "166 8 99 175 188 233 240 219 ... 64 222 178 15"
string encoded = string.Join(" ", array);

byte[] back = encoded
  .Split(' ')
  .Select(item => byte.Parse(item))
  .ToArray();