Перевод данных в base64

269
06 октября 2017, 14:26

Допустим есть массив из 4 чисел. Мне нужно перевести их в base64 но вообще можно и в HEX. Что в принципе не суть. Дело в том что мне нужно что бы код не сам выбрал сколько байт занимают эти числа. А самому определить в скольких количествах байт будет храниться число. В моём конкретном случае это 2, 2, 4, 4 байт. Допустим я создам массив интов. Как выдать каждому число то количество байт для хранения сколько я хочу? Или для этого лучше воспользоваться не массивом а списком?

вот допустим мой пример. Как выдать каждому число то количество байт сколько я хочу?

List<object> list = new List<object>() { 128, 15, 25, 175 }; 
string[] sList = new string[4]; 
for(int i = 0; i < 4; i++) 
{ 
  sList[i] = Convert.ToString(list[i], 16); 
}

И ещё такой вопрос. В моём примере не хочет работать конвертация в hex. Что я делаю не так?

Answer 1

Метод string Convert.ToBase64String(Byte[])

Преобразования в байты с чисел разных размеров занимается BitConvert

int[] a = new int[4] {1000, 1001, 1002, 1003}; //Ваш массив
byte[] binData = new byte[2+2+4+4];
BitConvert.GetBytes((ushort)a[0]).CopyTo(binData, 0); //Копируем в начало
BitConvert.GetBytes((ushort)a[1]).CopyTo(binData, 2); //Копируем со смещением 2
BitConvert.GetBytes((uint)a[2]).CopyTo(binData, 4);//Копируем со смещением 2+2
BitConvert.GetBytes((uint)a[3]).CopyTo(binData, 8);//Копируем со смещением 2+2+4
string BASE64 = Convert.ToBase64String(binData); //Получаем base64
Answer 2

Ниже универсальное решение без проверки переполнения.

Автор, было бы здорово - понять, для чего ты это хочешь делать и с какими данными работаешь. Из описания твоей задачи я могу сделать вывод, что тебе скорее нужно записывать стандартные типы данных: Byte, Int16, Int32, Int64, и в этом случае вопрос - зачем все эти извращения, и почему бы просто не использовать BinaryWriter в связке с MemoryStream, или, если данные типизированы, не описать их в структурах для последующего мапинга на массив байт (или маршалинга).

public static unsafe void Main(string[] args)
{
    long[] numbers = {128, 15, 25, 175, 7};
    int[] sizes = {2, 2, 4, 4, 9};
    if (numbers.Length != sizes.Length)
        throw new InvalidDataException("numbers.Length != size.Length");
    if (numbers.Length < 1)
    {
        Console.WriteLine("Empty array");
        return;
    }
    int bufferSize = 0;
    foreach (var size in sizes)
    {
        if (size < 1)
            throw new InvalidDataException($"Invalid size: {size}");
        bufferSize += size;
    }
    int position = 0;
    byte[] buff = new byte[bufferSize];
    byte[] integerBuffer = new byte[sizeof(long)];
    fixed (byte* integerPtr = integerBuffer)
    fixed (byte* buffPtr = buff)
    {
        for (int i = 0; i < numbers.Length; i++)
        {
            long number = numbers[i];
            int desiredSize = sizes[i];
            int size = Math.Min(desiredSize, sizeof(long));
            int paddingSize = desiredSize - size;
            *(long*)integerPtr = number;
            for (int n = 0; n < size; n++)
                buffPtr[position++] = integerPtr[n];
            if (paddingSize > 0)
            {
                byte padding = number < 0 ? byte.MaxValue : byte.MinValue;
                for (int n = 0; n < paddingSize; n++)
                    buffPtr[position++] = padding;
            }
        }
    }
    string result = Convert.ToBase64String(buff);
    Console.WriteLine(result);
}
READ ALSO
WPF&amp;MVVM: как определить метод SetProperty для ViewModel?

WPF&MVVM: как определить метод SetProperty для ViewModel?

Как определить метод SetProperty для ViewModel в шаблоне MVVM? Я видел в некоторых примерах, что для этого применяется интерфейс BindingBase, который тоже надо...

215
Java типы, допускающие NULL значения

Java типы, допускающие NULL значения

Существуют ли в Java что-то вроде типов, допускающих NULL значения? То есть с сервера приходит, на пример, int, но вместо него может прийти NULL В C#можно...

219
поключение к базу данных c# mvc asp.net [требует правки]

поключение к базу данных c# mvc asp.net [требует правки]

ЗдравствуйтеЯ создал чат по интрукции https://metanit

246
Помогите поправить алгоритм на C#

Помогите поправить алгоритм на C#

Здравствуйте! Я недавно начал изучать C#Помогите, пожалуйста, поправить алгоритм

241