繁体   English   中英

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

[英]Converting String to Byte Array and vice versa

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

RandomNumberGenerator gen = new RNGCryptoServiceProvider();
byte[] randomBytes = new byte[32];
gen.GetBytes(randomBytes);

在某些情况下(或unicode以外的任何编码):

randomBytes != Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(randomBytes));

我想知道如何使用这种方法并确保获得相同的结果。 提前致谢

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

Base64( Convert.ToBase64String )适合您吗?

您还可以将字节卡入字符( new string(myBytes.Select(b => (char)b).ToArray()) )。 这将产生难以理解的字符串,容易被其他系统破坏。 可能不是正确的道路。

任意字节数组不需要编码有效的 Unicode字符串(有关详细信息,请参阅https://en.wikipedia.org/wiki/UTF-16 ),例如

  byte[] before = new byte[] { 0xA6, 0xDD };
  byte[] after = Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(before));

  if (!before.SequenceEqual(after))
    Console.Write(string.Join(Environment.NewLine,
      $"before: {string.Join(" ", before.Select(b => b.ToString("x2")))}",
      $"after:  {string.Join(" ", after.Select(b => b.ToString("x2")))}"));

结果:

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的帮助下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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM