【问题标题】:How to convert base 64 string to array of bytes without data loss?如何在不丢失数据的情况下将 base 64 字符串转换为字节数组?
【发布时间】:2013-05-23 10:04:42
【问题描述】:

我有一个 base 64 字符串。我想写的是数组字节到二进制文件(.dat)

我使用以下代码来做到这一点。请参考。

string s = "do+BmqbI81d3XT85OGtX965DkWqSg0Iqy47VSPNMrkH9TBR9XMg8jn4xI8VCZBxXrI6h17nWAdeRzZicQVHCibIFBiTPA7YM0pvYQwrk3npyxJ8GuFMYbFiIXlrvgg3S7LqCZ1Wy0LPmhc51qMQ2QZDwGDqTV/fdYFVuCoYj3Mw=";

            byte[] b = Encoding.UTF8.GetBytes(s);

            File.WriteAllBytes(@"D:\\newbin2.dat", b);

但我没有得到预期的结果。二进制文件不应该是人类可读的。我尝试用notepad++打开,即使我把它写成字节,我也能看到相同的文本。

哪里出错了?

【问题讨论】:

  • “人类可读”是主观的;二进制就是二进制。如果它碰巧包含看起来很像文本的东西,那不是二进制文件的错。如果你需要安全,你应该加密它。在您的 UTF-8 示例中,它如此非常可读的原因是您基本上将 base-64 保存为字符串,而不是存储底层二进制文件。

标签: c# .net bytearray binaryfiles


【解决方案1】:

您正在使用错误的编码将字符串 s 转换为字节。正如您所提到的,它应该是 base64 编码,而不是 UTF8。像这样:

byte[] b = Convert.FromBase64String(s);

【讨论】:

  • @ShafiqAbbas 在此处定义“解码”... 显示的代码(非常正确,IMO)只是将 base-64 转换回 128 字节的实际数据,并将其存储。
  • 其实我应该从字符串中得到 172 个字节。但如果我使用 Convert.Frombase64string(),我只得到 128 个字节。
  • @ShafiqAbbas 不,你应该得到 128 个字节。你误会了。 Base-64 需要 额外空间(因此看起来更长)来存储相同的数据,因为它必须将自身限制为仅使用每个字符中的 6 位(这意味着每个字节中的 6 位,对于ASCII / UTF-8 / 等下游编码)。 128 * 8 / 6 = 170.6(所以,171个字符);加上填充 (=) 以获得完整的块。您的 base-64 的 172 个字符仅代表 128 个字节的实际数据
猜你喜欢
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多