[.NET] Base64, Base32 и Base16 кодировки в .NET
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
BaseN кодировкаBaseN кодировки используются для кодирования двоичных данных в текстовый вид. Где N это размер текстового алфавита используемого для кодирования. Применяются BaseN кодировки для "подготовки данных" к передаче по текстовым протоколам (HTTP, SMTP) или нецифровым каналам (напр. печать на бумаге).Самый популярный вариант такой кодировки это Base64. Сравниться по частоте применения может только Base16известный как hexadecimal или просто hex. Инструменты для работы с ними есть в .NET еще с первых версий, но они не очень удобные.Что есть в .NET Framework (Core)System.Security.CryptographyToBase64Transform/FromBase64TransformПара классов для преобразования в/из Base64. С помощью вспомогательного класса CryptoStream его можно использовать для потоковой обработки Stream.
using System.Security.Cryptography;
var base64Transform = new ToBase64Transform();
var output = new MemoryStream();
var base64Encoder = new CryptoStream(output, base64Transform, CryptoStreamMode.Write);
base64Encoder.Write(new byte[] { 122 }, 0, 1);
base64Encoder.Close();
// output.ToArray() -> byte[4] { 101, 103, 61, 61 } aka "eg=="
System.ConvertToBase64String/FromBase64StringПара функции для преобразования массива байтов в Base64 строку и обратно.
using System;
var bytes = System.Convert.FromBase64String("eg==")
// bytes -> 122
System.BitConverterBitConverter.ToStringФункция преобразования массива байтов в Base16 (hexadecimal) строку, где каждый байт разделен дефизом. Пример: 0A-C0-D3
using System;
var hexString = BitConverter.ToString(new byte[] { 122, 122 });
// hexString -> "7A-7A"
System.Runtime.Remoting.Metadata.W3cXsd2001SoapHexBinary (Framework-only)Класс позволяющий преобразовывать массив байтов в Base16 (hexadecimal) строку и обратно.
using System.Runtime.Remoting.Metadata.W3cXsd2001;
var result = SoapHexBinary.Parse("A012");
// result.Value -> byte[];
System.Buffers.TextBase64(Core or System.Memory package)Удобный класс для работы Base64 в режиме потока. Можно толкать Span'ы с байтами и получать результат в свой Span байтов.Что предлагает NugetMultiformats.Base - Base2, 8, 16, 32, 58, 64 (+variants), MITУдобная библиотека с очень большим набором вариантов BaseN кодировок. Простое API и есть тесты. Из недостатков: он работает только с массивами.SimpleBase - Base16, 32, 58, 85 (+variants), streaming, span, Apache-2Библитека с большим набором BaseN кодировок. Есть поддержка .NET Core и работа со Span'ами. Простое API, есть тесты.Пакет deniszykov.BaseNКонечно у всех этих классов и библиотек есть фатальный недостаток. Помимо этого, большинство бросило поддержку .NET Framework 4.5.С точки зрения фичей, только класс Base64 умеет в Span<byte> to Span<byte> преобразования (везде это char[] <-> byte[] преобразования). А это частый кейс, когда данные приходят из сети. Эти данные не могут быть "интерпретированы" из byte в char по тому, что char занимает 2 байта в памяти. Т.е. для их преобразования, вышеописанными библиотеками, требуется скопировать их во временный буфер вдвое большего размера чем исходные данные.В этом пакете функции кодирования/декодирования принимают разные типы входящих данных:
- byte[]
- char[]
- string
- byte*
- char*
- Span<byte>
- Span<char>
Все это лежит внутри двух классов BaseNDecoder/BaseNEncoder. Поддерживаются следующие словари кодирования:
- Base16 (hexadecimal/lower/upper)
- Base32
- ZBase32
- Base64
- Base64 Url-safe
using deniszykov.BaseN;
var bytes = Base64Convert.ToBytes("eg==");
// bytes[0] -> 122
Более богатый набор предлагает класс BaseNEncodingкоторый реализует System.Text.Encoding.
using deniszykov.BaseN;
var count = BaseNEncoding.Base64Url.GetByteCount("eg=="); // -> 1
var bytes = BaseNEncoding.Base64Url.GetBytes("eg=="); // -> 122
var baseNEncoder = new BaseNEncoder(BaseNAlphabet.Base64Alphabet);
var input = "eg==";
var output = new byte[1024];
baseNEncoder.Convert(input, 0, 4, output, 0, 1, true, out var charsUsed, out var bytesUsed, out var completed);
// output[0] -> 122
Другие примеры "простого" использования лежат тут. Можно использовать свой словарь. Сложных примеров не будет, те кому это надо могут найти их в тестах:)
Install-Package deniszykov.BaseN
===========
Источник:
habr.com
===========
Похожие новости:
- [.NET, ASP, C#] Разница между AddTransient, AddScoped и AddSingleton в ASP.NET Core (перевод)
- [Информационная безопасность, Разработка веб-сайтов, Анализ и проектирование систем, .NET] RBAC? ABAC?.. PERM! Новый подход к авторизации в облачных веб-службах и приложениях
- [.NET, Разработка мобильных приложений, Сетевые технологии, C#, История IT] Менеджер приложений для Windows Mobile
- [Программирование, .NET, C#] Провайдер логирования для Telegram (.NET 5 / .NET Core)
- [.NET, Облачные сервисы] Переход с Azure на GCP, с ASP.NET MVC на ASP.NET Core 3.1
- [.NET, F#] Пример реального проекта на F#
- [Программирование, .NET, ASP, C#] Фильтры действий, или Как просто улучшить читаемость кода
- [.NET, ООП] Наследование в Nuget-пакетах
- [.NET, Проектирование и рефакторинг, C#, Профессиональная литература] Внедрение зависимостей для начинающих (перевод)
- [.NET, C#] Nuke. Быстрый старт
Теги для поиска: #_.net, #_base16, #_base64, #_base32, #_base64url, #_zbase32, #_.net
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:48
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
BaseN кодировкаBaseN кодировки используются для кодирования двоичных данных в текстовый вид. Где N это размер текстового алфавита используемого для кодирования. Применяются BaseN кодировки для "подготовки данных" к передаче по текстовым протоколам (HTTP, SMTP) или нецифровым каналам (напр. печать на бумаге).Самый популярный вариант такой кодировки это Base64. Сравниться по частоте применения может только Base16известный как hexadecimal или просто hex. Инструменты для работы с ними есть в .NET еще с первых версий, но они не очень удобные.Что есть в .NET Framework (Core)System.Security.CryptographyToBase64Transform/FromBase64TransformПара классов для преобразования в/из Base64. С помощью вспомогательного класса CryptoStream его можно использовать для потоковой обработки Stream. using System.Security.Cryptography;
var base64Transform = new ToBase64Transform(); var output = new MemoryStream(); var base64Encoder = new CryptoStream(output, base64Transform, CryptoStreamMode.Write); base64Encoder.Write(new byte[] { 122 }, 0, 1); base64Encoder.Close(); // output.ToArray() -> byte[4] { 101, 103, 61, 61 } aka "eg==" using System;
var bytes = System.Convert.FromBase64String("eg==") // bytes -> 122 using System;
var hexString = BitConverter.ToString(new byte[] { 122, 122 }); // hexString -> "7A-7A" using System.Runtime.Remoting.Metadata.W3cXsd2001;
var result = SoapHexBinary.Parse("A012"); // result.Value -> byte[];
using deniszykov.BaseN;
var bytes = Base64Convert.ToBytes("eg=="); // bytes[0] -> 122 using deniszykov.BaseN;
var count = BaseNEncoding.Base64Url.GetByteCount("eg=="); // -> 1 var bytes = BaseNEncoding.Base64Url.GetBytes("eg=="); // -> 122 var baseNEncoder = new BaseNEncoder(BaseNAlphabet.Base64Alphabet); var input = "eg=="; var output = new byte[1024]; baseNEncoder.Convert(input, 0, 4, output, 0, 1, true, out var charsUsed, out var bytesUsed, out var completed); // output[0] -> 122 Install-Package deniszykov.BaseN
=========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:48
Часовой пояс: UTC + 5