Для этого вы можете создавать массивы правильного типа (byte [] и short []) и использовать Buffer.BlockCopy()
для копирования байтов между ними, таким образом конвертируя данные.
Это не учитывает для разностей с прямым порядком байтов и прямым порядком байтов, но поскольку вы утверждаете, что это нужно выполнять только в системах с прямым порядком байтов, нам не нужно об этом беспокоиться.
Вот пример консольного приложения, которое демонстрирует, как сделать преобразование. Он выполняет следующие действия:
- Создает массив шорт 0..99 включительно.
- Преобразует массив шорт в массив байтов (с сохранением порядка байтов).
- Преобразовать массив байтов в строку с базой 64.
- Преобразовать строку с базой 64 обратно в массив байтов.
- Преобразовать массив байтов обратно в массив шорт (с сохранением порядка байтов).
- Сравните преобразованный массив шорт с исходным массивом, чтобы убедиться в правильности.
Вот код:
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");
}
}
}