【问题标题】:convert byte array to string but not with Convert.ToBase64将字节数组转换为字符串,但不能使用 Convert.ToBase64
【发布时间】:2018-05-08 10:02:17
【问题描述】:

亲爱的

我有一个从 web 服务器返回的字节数组,它是 json 序列化对象(属性值)的一部分 在 json 字符串中如下所示:

,"n":"y1GpP7FibyTYl40Jhx1B90WOi1mecJfpi4IEhbHPbAB64jhV16UlpEPyGpNIzDS4Lct80sIs7FW5Vnf38Z-tzPbtHyFVYYU2AC4SVrwQp9-ELz-..._xW3bmMxuwoBgHpWDTw"

请注意末尾没有双等号,就像 Base64 字符串一样。我使用了三个点 (...) 来使字符串表示更短
我可以反序列化对象并获得正确的字节数组:

var kb = JsonConvert.DeserializeObject<KeyBundle>(Properties.Resources.keyBundleJson);

它可以序列化回json吗:

JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.None,
    Formatting = Formatting.Indented
};

string json = JsonConvert.SerializeObject(kb, settings);

但问题是结果属性值看起来与原始字符串不一样:

from web server it was:
y1GpP7FibyTYl40Jhx1B90WOi1mecJfpi4IEhbHPbAB64jhV16UlpEPyGpNIzDS4Lct80sIs7FW5Vnf38Z-tzPbtHyFVYYU2AC4SVrwQp9-ELz-..._xW3bmMxuwoBgHpWDTw

serialized locally:
y1GpP7FibyTYl40Jhx1B90WOi1mecJfpi4IEhbHPbAB64jhV16UlpEPyGpNIzDS4Lct80sIs7FW5Vnf38Z+tzPbtHyFVYYU2AC4SVrwQp9+ELz+.../xW3bmMxuwoBgHpWDTw==

下划线和斜线,加号和减号,末尾两个等号

是否可以完全像 web-server 那样序列化字节数组? 我有一个想法,用 Json 序列化它,然后用加号替换减号,用斜线替换下划线并删除最后两个等号。

还有其他方法可以立即开箱即用吗?

问候

【问题讨论】:

  • 看起来像modified base64
  • 有许多不同的 base64 变体。看看这个:en.wikipedia.org/wiki/Base64#Variants_summary_table
  • @arekzyla:啊,你打败了我。 oleksa:但是,似乎没有办法在 C# 实现中指定变体。您只能告诉方法在每 76 个字符后用换行符格式化字符串。看来您必须自己实现才能获得正确的变体。您可能从 Web 服务器获得了 RFC7515 变体,并在 C# 中获得了 RFC4648。 Stefan Zvonar 在 John 链接的帖子中的回答很可能正是您需要做的。

标签: c# arrays string serialization json.net


【解决方案1】:

在 url 中有不同的 Base64 变体与 -_ 一起使用,不需要额外的编码(例如,+ 将被编码为 %2B)。为此,您可以简单地使用字符串Replace 方法来替换这些字符。

如果您想要一个开箱即用的解决方案,您可以尝试Microsoft.IdentityModel.Tokens nuget 包:

var encoded = Base64UrlEncoder.Encode(someString);
var decoded = Base64UrlEncoder.Decode(encoded);

欲了解更多信息:https://en.wikipedia.org/wiki/Base64#URL_applications

【讨论】:

  • string Base64UrlEncoder.Encode(byte[] inArray) 做得很好,谢谢
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 2021-02-04
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多