【问题标题】:Is byte[] to UTF8 to JSON string a safe encoding for binary data?byte[] 到 UTF8 到 JSON 字符串是二进制数据的安全编码吗?
【发布时间】:2021-07-26 20:22:54
【问题描述】:

我希望将 HTML POST 请求的正文记录到我的 Web API 的文本文件中。我想要它以便“人类可读”字符易于查看,因此我不想将其编码为 base64,但我还需要对所有非“人类可读”字节进行安全编码,以便它们可以始终恢复为与输入数组完全相同的byte[]

以下代码是否总是将所有不可读的字节安全地存储为 JSON 转义序列,同时将可读的字符存储为它们本身?

byte[] bodyBytes = GetBodyBytes(ctx);
var bodyString = System.Text.Encoding.UTF8.GetString(bodyBytes);
var safeString = Newtonsoft.Json.JsonConvert.SerializeObject(new { bodyString });

我可以立即看到的一个问题是,这会将换行序列简单地存储为\n,从而丢失有关它们是否使用 Windows 或 Unix 样式的换行字节的数据。我怎样才能避免丢失任何此类数据,同时尽可能保持人类可读?

【问题讨论】:

  • 所有其他控制字符也可能有问题;不同的编码可能是一个更好的主意
  • 请记住,当您从字节数组转到字符串时,您就是在de编码。并非所有字节序列都有效地表示 UTF-8 数据。此外,您显示的示例代码在计算后不使用bodyString
  • 将原始二进制数据转换为 UTF-8 字符串绝不是一个好主意。 UTF-8 是一个复杂的规范,其中包含许多可能会影响您的数据的意外特殊情况。为什么不将数据保存为 byte[] 并直接从 byte[] 解析?
  • @KarlKnechtel 那是个错误;已编辑。
  • @罗伯特我可以;我希望有一些标准的“安全”方式来做到这一点,这样很多可读的字符,如[a-z-A-Z0-9] 等将按字面意思表示,因此可以快速阅读,而其他所有内容都会被转义。我可能会自己动手,但如果有人已经做过就更好了。

标签: c# encoding


【解决方案1】:

最后,我推出了自己的编码,因为我的要求可能过于具体,无法完全实现现有的编码方案。这是我创建的方法:

private string UltraSafeEncode(byte[] bytes) {
    if (bytes == null) {
        throw new ArgumentNullException(nameof(bytes));
    }

    var sb = new System.Text.StringBuilder();

    foreach (var thisByte in bytes) {
        if (thisByte < 32 || thisByte == 92 || thisByte > 126) {
            sb.Append('\\').AppendFormat("{0:x2}", thisByte);
            continue;
        }

        sb.Append((char)thisByte);
    }

    return sb.ToString();
}

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多