Я конвертирую что-то из VB в C #. Возникла проблема с синтаксисом этого оператора:
if ((searchResult.Properties["user"].Count > 0))
{
profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}
Затем я вижу следующие ошибки:
Аргумент 1: невозможно преобразовать из объекта в byte []
Наилучшее совпадение перегруженного метода для System.Text.Encoding.GetString (byte []) содержит неверные аргументы
Я пытался исправить код, основанный на этом посте, но все равно безуспешно
string User = Encoding.UTF8.GetString("user", 0);
Какие-либо предложения?
searchResult.Properties["user"][0]
? Попробуйтеbyte[]
(byte[])
поисковому результату?Properties["user"][0]
. Если вы уверены , что это массив , то вы можете бросить , как этоprofile.User = System.Text.Encoding.UTF8.GetString((byte[])searchResult.Properties["user"][0]);
Ответы:
Если у вас уже есть байтовый массив, вам нужно знать, какой тип кодировки использовался для его преобразования в этот байтовый массив.
Например, если байтовый массив был создан следующим образом:
Вам нужно будет превратить его обратно в строку, например так:
Если вы можете найти в коде, который вы унаследовали, кодировку, используемую для создания байтового массива, тогда вам следует установить.
источник
Прежде всего, добавьте
System.Text
пространство именТогда используйте этот код
Надеюсь это исправить!
источник
Также вы можете использовать метод расширения, чтобы добавить метод к
string
типу, как показано ниже:И используйте это как ниже:
источник
ToASCIIByteArray
. Ненавижу, когда узнаю, что какая-то библиотека, которую я использую, использует ASCII, и я предполагаю, что она использует UTF-8 или что-то более современное.источник
источник
Почему не следует использовать Encoding.Default ...
Ответ Рэндалла использует
Encoding.Default
, однако Microsoft выдвигает против него предупреждение :Чтобы проверить, что такое кодировка по умолчанию, используйте
Encoding.Default.WindowsCodePage
(1250 в моем случае - и, к сожалению, нет предопределенного класса кодировки CP1250, но объект может быть получен какEncoding.GetEncoding(1250)
).Encoding.ASCII
7bit, так что в моем случае это тоже не работает:... и почему вместо этого следует использовать кодировку UTF-8 ...
Кодировка по умолчанию вводит в заблуждение: .NET использует UTF-8 повсеместно в качестве реального значения по умолчанию (8-битные кодировки устарели к концу 20-го века, проверьте т.е.
Console.OutputEncoding.EncodingName
*), поэтому каждая константа, которую вы определяете в коде, кодируется в UTF-8 по умолчанию - так этот следует использовать, если источник данных не находится в другой кодировке.* В моем случае это UTF-8, что является прямой ложью:
chcp
из консоли Windows (cmd) возвращает 852 - и это не должно быть изменено, потому что у локализованных системных команд (например, ping) эта кодовая страница жестко закодированаСледуя рекомендации Microsoft:
Encoding.UTF8
Рекомендовано другими - это экземпляр кодировки UTF-8 UF и может также использоваться напрямую или как... но это не всегда используется
Кодировка для байтовых массивов должна «просто работать» в Unicode в западных странах, но как только вы перенесете свою программу в некоторые менее поддерживаемые регионы (например, здесь, в Восточной Европе), это настоящий беспорядок: в Чешской Республике по умолчанию Windows использует (в 2020 году!) MS нестандартный 852 (он же Latin-2) для консоли, 1250 как Windows OEM, UTF-8 (65001) как .NET (и другие) новый по умолчанию, и мы должны помнить, что некоторые западные 8-битные ЕС данные все еще в 1252 году, в то время как старый 8-битный западный стандарт для Восточной Европы был ISO-8859-2 (он же Latin-2, но НЕ тот же самый Latin-2, как 852). Использование ASCII означает текст, полный тофу и '?' Вот. Так что до половины 21-го века, пожалуйста, установите UTF-8 явно .
источник
Основываясь на ответе Али , я бы порекомендовал метод расширения, который позволяет при желании передать кодировку, которую вы хотите использовать:
И используйте это как ниже:
источник
Encoding encoding = Encoding.Default
результатов приводит к ошибке времени компиляции:CS1736 Default parameter value for 'encoding' must be a compile-time constant
Следующий подход будет работать, только если символы 1 байт. (Unicode по умолчанию не будет работать, так как это 2 байта)
Сохраняя это простым
источник
char
иstring
UTF-16 по определению.string
и, следовательно, UTF-16. UTF-16 не используется по умолчанию; в этом нет выбора. Затем вы разбиваетесь наchar[]
единицы кода UTF-16. Затем вы вызываете Convert.ToByte (Char) , который просто преобразует U + 0000 в U + 00FF в ISO-8859-1 и корректирует любые другие кодовые точки.char
чтобы быть 16 битами иConvert.ToByte()
выбрасывать половину из них.использовать этот
источник
Уточнение правки Джастина Столя (использование Эраном Йогевым BlockCopy).
Предлагаемое решение действительно быстрее, чем с использованием Encoding. Проблема в том, что он не работает для кодирования байтовых массивов неравной длины. Как дано, это вызывает исключение. Увеличение длины на 1 оставляет завершающий байт при декодировании из строки.
Для меня необходимость возникла, когда я хотел кодировать из
DataTable
вJSON
. Я искал способ кодировать двоичные поля в строки и декодировать из строки обратно вbyte[]
.Поэтому я создал два класса - один, который упаковывает вышеуказанное решение (при кодировании из строк это нормально, потому что длины всегда четные), а другой - для
byte[]
кодирования.Я решил проблему с неравной длиной, добавив один символ, который говорит мне, была ли исходная длина двоичного массива нечетной ('1') или четной ('0')
Следующее:
источник
На этот вопрос отвечали достаточно много раз, но с C # 7.2 и введением типа Span, существует более быстрый способ сделать это в небезопасном коде:
Имейте в виду, что байты представляют строку в кодировке UTF-16 (называемую «Unicode» в C # land).
Некоторый быстрый сравнительный анализ показывает, что вышеупомянутые методы примерно в 5 раз быстрее, чем их реализации Encoding.Unicode.GetBytes (...) / GetString (...) для строк среднего размера (30-50 символов), и даже быстрее для больших строк. Эти методы также работают быстрее, чем использование указателей с Marshal.Copy (..) или Buffer.MemoryCopy (...).
источник
Если результатом 'searchResult.Properties ["user"] [0] "является строка:
Ключевым моментом является то, что преобразование строки в byte [] может быть сделано с помощью LINQ:
И обратное:
источник
Кто-нибудь видит причину, почему бы не сделать это?
источник
Convert.ToByte(char)
не работает так, как вы думаете. Символ'2'
преобразуется в байт2
, а не в байт, представляющий символ'2'
. Используйтеmystring.Select(x => (byte)x).ToArray()
вместо этого.Это то, что работает для меня
источник
Вы можете использовать MemoryMarshal API для очень быстрого и эффективного преобразования.
String
неявно приводиться кReadOnlySpan<byte>
, так какMemoryMarshal.Cast
принимает либоSpan<byte>
или вReadOnlySpan<byte>
качестве входного параметра.Следующий бенчмарк показывает разницу:
источник
Эта работа для меня, после этого я смог преобразовать свою картинку в поле bytea в моей базе данных.
источник