C# Преобразование строки base64 в 16-битные слова, хранящиеся в порядке байтов с прямым порядком байтов - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь загрузить base64 подписи, но мне нужно, чтобы это была кодировка base64 массива 16-битных слов, хранящихся в порядке байтов с прямым порядком байтов. Может ли кто-нибудь помочь мне преобразовать base64 в 16-битный массив в байтах с прямым порядком байтов, а затем снова преобразовать его в base64?

1 Ответ

0 голосов
/ 05 августа 2020

Для этого вы можете создавать массивы правильного типа (byte [] и short []) и использовать Buffer.BlockCopy() для копирования байтов между ними, таким образом конвертируя данные.

Это не учитывает для разностей с прямым порядком байтов и прямым порядком байтов, но поскольку вы утверждаете, что это нужно выполнять только в системах с прямым порядком байтов, нам не нужно об этом беспокоиться.

Вот пример консольного приложения, которое демонстрирует, как сделать преобразование. Он выполняет следующие действия:

  1. Создает массив шорт 0..99 включительно.
  2. Преобразует массив шорт в массив байтов (с сохранением порядка байтов).
  3. Преобразовать массив байтов в строку с базой 64.
  4. Преобразовать строку с базой 64 обратно в массив байтов.
  5. Преобразовать массив байтов обратно в массив шорт (с сохранением порядка байтов).
  6. Сравните преобразованный массив шорт с исходным массивом, чтобы убедиться в правильности.

Вот код:

using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create demo array of shorts 0..99 inclusive.

            short[] sourceShorts = Enumerable.Range(0, 100).Select(i => (short)i).ToArray();

            // Convert array of shorts to array of bytes. (Will be little-endian on Intel.)

            int byteCount = sizeof(short) * sourceShorts.Length;
            byte[] dataAsByteArray = new byte[byteCount];
            Buffer.BlockCopy(sourceShorts, 0, dataAsByteArray, 0, byteCount);

            // Convert array of bytes to base 64 string.

            var asBase64 = Convert.ToBase64String(dataAsByteArray);
            Console.WriteLine(asBase64);

            // Convert base 64 string back to array of bytes.

            byte[] fromBase64 = Convert.FromBase64String(asBase64);

            // Convert array of bytes back to array of shorts.

            if (fromBase64.Length % sizeof(short) != 0)
                throw new InvalidOperationException("Byte array size must be multiple of sizeof(short) to be convertable to shorts");

            short[] destShorts = new short[fromBase64.Length/sizeof(short)];
            Buffer.BlockCopy(fromBase64, 0, destShorts, 0, fromBase64.Length);

            // Prove that the unconverted shorts match the source shorts.

            if (destShorts.SequenceEqual(sourceShorts))
                Console.WriteLine("Converted and unconverted successfully");
            else
                Console.WriteLine("Error: conversion was unsuccessful");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...