Допустим есть массив из 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. Что я делаю не так?
Метод 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
Ниже универсальное решение без проверки переполнения.
Автор, было бы здорово - понять, для чего ты это хочешь делать и с какими данными работаешь. Из описания твоей задачи я могу сделать вывод, что тебе скорее нужно записывать стандартные типы данных: 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);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как определить метод SetProperty для ViewModel в шаблоне MVVM? Я видел в некоторых примерах, что для этого применяется интерфейс BindingBase, который тоже надо...
Существуют ли в Java что-то вроде типов, допускающих NULL значения? То есть с сервера приходит, на пример, int, но вместо него может прийти NULL В C#можно...
ЗдравствуйтеЯ создал чат по интрукции https://metanit
Здравствуйте! Я недавно начал изучать C#Помогите, пожалуйста, поправить алгоритм