.Net 8-битное кодирование

Я работаю над последовательным портом, передаю и получаю данные на какое-то оборудование с 8-битными данными. Я хотел бы сохранить его как строку, чтобы облегчить сравнение, а предустановленные данные хранятся в виде строки или шестнадцатеричного формата в файле xml. Я обнаружил, что только при использовании Encoding.Default, который является кодировкой ANSI, 8-битные данные преобразуются правильно и легко обратимы. Кодировка ASCII работает только для 7-битных данных, а UTF8 или UTF7 тоже не работают, так как я использую какой-то символ из 1-255. Encoding.Default подойдет, но я прочитал в MSDN, что он зависит от настройки кодовой страницы ОС, а это означает, что он может вести себя по-разному на другой настроенной кодовой странице. Я широко использую GetBytes () и GetString, используя Encoding, но мне нужен надежный и переносимый метод, который работает все время при любой конфигурации. Любая идея или лучшее предложение для этого?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
7 038
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Почему бы вместо этого просто не использовать массив байтов? У него не будет проблем с кодированием, которые могут возникнуть при использовании текстового подхода.

Иногда при последовательном вводе-выводе вы хотите отправить строки текста с вкраплениями управляющих символов. Легче читать, если вы используете строки.

Joe 21.09.2008 21:55

@Joe: вы всегда можете использовать ASCIIEncoding для получения строки для серии байтов.

user7116 21.09.2008 21:58

Используйте это вместе с Latin-1

Vincent McNabb 22.09.2008 15:40

Вы можете использовать кодировку base64 для преобразования байта в строку и обратно. Таким образом не будет проблем с кодовыми страницами или странными символами, и это будет более компактно, чем шестнадцатеричный.

byte[] toEncode; 
string encoded = System.Convert.ToBase64String(toEncode);

Потому что OP хочет текстовое представление двоичных данных, которое легко преобразовать и поместить в XML. Кодировка Base64 отвечает всем требованиям.

Matt Howells 31.08.2010 14:26

Используйте кодовую страницу на иврите для Windows-1255. Его 8-битный.
Кодировка encoding = Encoding.GetEncoding ("windows-1255");

Я неправильно понял вас, когда вы написали "1-255", подумал, что вы ссылаетесь на символы в кодовой странице 1255.

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

static bool CompareRange(byte[] a, byte[] b, int index, int count)
{
    bool res = true;
    for(int i = index; i < index + count; i++)
    {
        res &= a[i] == b[i];
    }
    return res;
}

Мне нужно работать со строкой и ее встроенными функциями, такими как IndexOf, Replace, Split и SubString. Подобно комментарию Джо к ответу Лассевка

faulty 22.09.2008 06:14
Ответ принят как подходящий

Latin-1, он же ISO-8859-1, он же кодовая страница 28591, является полезной кодовой страницей для этого сценария, поскольку он отображает значения в диапазоне 128-255 без изменений. Следующие элементы взаимозаменяемы:

Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("iso-8859-1")

Следующий код иллюстрирует тот факт, что для Latin1, в отличие от Encoding.Default, все символы в диапазоне 0–255 отображаются без изменений:

static void Main(string[] args)
{

    Console.WriteLine("Test Default Encoding returned {0}", TestEncoding(Encoding.Default));
    Console.WriteLine("Test Latin1 Encoding returned {0}", TestEncoding(Encoding.GetEncoding("Latin1")));
    Console.ReadLine();
    return;
}

private static bool CompareBytes(char[] chars, byte[] bytes)
{
    bool result = true;
    if (chars.Length != bytes.Length)
    {
        Console.WriteLine("Length mismatch {0} bytes and {1} chars" + bytes.Length, chars.Length);
        return false;
    }
    for (int i = 0; i < chars.Length; i++)
    {
        int charValue = (int)chars[i];
        if (charValue != (int)bytes[i])
        {
            Console.WriteLine("Byte at index {0} value {1:X4} does not match char {2:X4}", i, (int) bytes[i], charValue);
            result = false;
        }
    }
    return result;
}
private static bool TestEncoding(Encoding encoding)
{
    byte[] inputBytes = new byte[256];
    for (int i = 0; i < 256; i++)
    {
        inputBytes[i] = (byte) i;
    }

    char[] outputChars = encoding.GetChars(inputBytes);
    Console.WriteLine("Comparing input bytes and output chars");
    if (!CompareBytes(outputChars, inputBytes)) return false;

    byte[] outputBytes = encoding.GetBytes(outputChars);
    Console.WriteLine("Comparing output bytes and output chars");
    if (!CompareBytes(outputChars, outputBytes)) return false;

    return true;
}

Думаю, твоя идея была ближе всего. Я сначала попробую.

faulty 22.09.2008 06:16

Другие вопросы по теме