C #: дефляция XML дает другой результат, чем в JavaScript - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь дефлировать XML в C # и кодировать его base64.Я пытался использовать DeflateStream и GZipStream, но, похоже, я получаю другой результат, чем в библиотеке узлов.
Я опубликую код узла и код c #:

//zlib = require('zlib');
zlib.deflateRaw(xml, (function(_this) {
      return function(err, deflated) {
             return deflated.toString('base64');
      }
} 

C # DeflateStream

 private static byte[] Deflate(String str)
    {
      using (MemoryStream output = new MemoryStream())
      {
        using (DeflateStream gzip =
          new DeflateStream(output, CompressionMode.Compress))
        {
          using (StreamWriter writer =
            new StreamWriter(gzip, System.Text.Encoding.UTF8))
          {
            writer.Write(str);
          }
        }

        return output.ToArray();
      }
    }

C # GZipStream

public static byte[] Zip(string str)
{
      var bytes = Encoding.UTF8.GetBytes(str);

      using (var msi = new MemoryStream(bytes))
      using (var mso = new MemoryStream())
      {
        using (var gs = new GZipStream(mso, CompressionMode.Compress))
        {
          //msi.CopyTo(gs);
          CopyTo(msi, gs);
        }

        return mso.ToArray();
      }
 }

C # Base64 Код:

private static string Base64Encode(byte[] textBytes)
{
   return System.Convert.ToBase64String(textBytes);
} 

Что-то мне не хватает?

ОБНОВЛЕНИЕ

Я нашел пример, который работает.Используя это, я также могу декодировать его с помощью Node.

 var bytes = Encoding.UTF8.GetBytes(stringToDeflate);
  using (var output = new MemoryStream())
  {
    using (var zip = new DeflateStream(output, CompressionMode.Compress))
    {
      zip.Write(bytes, 0, bytes.Length);
    }
    var base64 = Convert.ToBase64String(output.ToArray());
  }

ОБНОВЛЕНИЕ 2 (рабочий код - для будущих поисковиков)

private static string DeflateAndEncode(string str)
    {
      var bytes = Encoding.UTF8.GetBytes(str);
      using (var output = new MemoryStream())
      {
        using (var zip = new DeflateStream(output, CompressionMode.Compress))
        {
          zip.Write(bytes, 0, bytes.Length);
        }
        var base64 = Convert.ToBase64String(output.ToArray());

        return base64;
      }
    }

    private static string DecodeAndInflate(string str)
    {
      var utf8 = Encoding.UTF8;
      var bytes = Convert.FromBase64String(str);
      using (var output = new MemoryStream())
      {
        using (var input = new MemoryStream(bytes))
        {
          using (var unzip = new DeflateStream(input, CompressionMode.Decompress))
          {
            unzip.CopyTo(output, bytes.Length);
            unzip.Close();
          }
          return utf8.GetString(output.ToArray());
        }
      }
    }

1 Ответ

0 голосов
/ 26 июня 2018

Символы, используемые для кодировки base-64, различаются в C # и Node.js.

C # использует следующие :

Цифры base-64в порядке возрастания от нуля находятся заглавные буквы от «A» до «Z», строчные буквы от «a» до «z», цифры от «0» до «9» и символы «+» и «/».Бесполезный символ "=" используется для конечного заполнения.

Node.js использует "URL-адрес и имя файла безопасны" Base 64 Alphabet " как указано в RFC4648, раздел 5:

A-Z, a-z, 0-9, - (minus), _ (underscore)
Trailing padding uses '='

Так что то, что вы пытаетесь сделать, не сработает.

Возможно, вы могли бы это исправить, заменив _ и - символы с + и / соответственно для преобразования кодировки C # в Node.js и наоборот перед декодированием base64 данных.

...