Сколько байт принимает нулевой терминатор в зависимости от выбранной кодировки? - PullRequest
3 голосов
/ 11 февраля 2020

Encoding.GetByteCount(String) говорит мне, сколько байт потребуется для представления данного C# string в byte[] на основе выбранной кодировки, но внешний протокол требует, чтобы строки заканчивались нулем и что общий размер сообщения, содержащего строку, отправляется в заголовке.

Вычисляет размер моего char[] так же просто, как добавление 1 byte к результату GetByteCount(String), или может мой NULL-терминатор тоже имеет разный размер в зависимости от кодировки? Если так, как я могу определить это?

Я спрашиваю в общем случае, а не о конкретной кодировке c.

например int HowManyNullBytesToAdd(Encoding encoding)

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Для всех обычно используемых кодировок простой ответ на ваш вопрос:

MyEncoding.GetByteCount("\0")

Однако, если вы хотите учесть полную общность, вы можете рассмотреть произвольные кодировки, возможно, даже не являющиеся частью каких-либо стандартных кодировок. что ты или я можем придумать. И тогда все ставки сняты. В этой полной общности, я думаю, вам нужно узнать больше о специфицированной кодировке c.

Однако для наиболее часто используемых кодировок Unicode, UTF-8, UTF-16 и UTF-32 простой код выше vaiid.

0 голосов
/ 11 февраля 2020

Количество байтов для представления вашей строки в байтах зависит от кодировки, которую ожидает получатель. поэтому следующее может дать не те же результаты, если ваша строка содержит не-ascii символы.

var byteCountASCII = System.Text.Encoding.ASCII.GetByteCount(yourCharArray);
var byteCountUTF8 = System.Text.Encoding.UTF8.GetByteCount(yourCharArray);

Если это ASCII, вы можете безопасно добавить 1 к нему для нулевого символа, но насколько я знаю, например, UTF16 использует 2 байта даже для простых символов ASCII, так что это также зависит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...