Сколько байтов составляет \n\r?

У меня есть приложение .NET, которое пытается передать файл по ftp, но в итоге получается 1 дополнительный байт на строку. Мой разделитель строк — Environment.NewLine, который, как мне кажется, переводится как \n\r. Сколько это байт?


person donde    schedule 26.05.2010    source источник


Ответы (8)


Это зависит от кодировки. В 8-битных кодировках, а также в UTF-8 это 2 байта. В UCS-2 или UTF-16 это 4 байта. В UCS-4 или UTF-32 это 8 байт.

Но проблема в том, что вы, вероятно, используете FTP в режиме ASCII, а не в режиме IMAGE.

person Ignacio Vazquez-Abrams    schedule 26.05.2010
comment
Разве UCS-4 и UTF-32 не одно и то же? - person BlueRaja - Danny Pflughoeft; 24.04.2013
comment
@BlueRaja-DannyPflughoeft: Пока. Но это не обязательно, чтобы всегда было правдой. - person Ignacio Vazquez-Abrams; 17.05.2013

Это 2 байта, но это должно быть \r\n, а не \n\r в ОС Windows.

person Jack    schedule 26.05.2010

В кодировке ASCII \n — это символ новой строки 0x0A (десятичное число 10), \r — символ возврата каретки 0x0D (десятичное число 13).

Как уже сказал Джек, правильная последовательность — CR-LF, а не наоборот.

FTP, вероятно, добавляет символы LF в ваш поток, если они размещены неправильно, и вы передаете файл как текст.

person cdonner    schedule 26.05.2010

Два байта. Один для \n и один для \r.

person Jeff    schedule 26.05.2010

Чтобы ответить на подразумеваемый вопрос:

Чтобы использовать двоичную передачу, а не передачу ascii в C#, используйте

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://example.com"));
reqFTP.UseBinary = true;
person BlueRaja - Danny Pflughoeft    schedule 26.05.2010

\n\r составляет 2 байта.

person Joshua    schedule 26.05.2010

Я знаю, что это старый вопрос, но ради будущих читателей; вы можете определить, сколько байтов находится в данной строке (или строковом значении) с помощью следующего:

Encoding.UTF8.GetByteCount("SomeString");

В таком случае;

Encoding.Unicode.GetByteCount(Environment.NewLine);
// OR
Encoding.Unicode.GetByteCount("\n\r");

.NET использует Unicode, если не указано иное; например, с помощью XmlSerializer вы можете указать кодировку.

Не забудьте использовать правильную кодировку, когда пытаетесь подсчитать количество байтов, поскольку она отличается для каждой кодировки:

  • Символ ASCII в 8-битной кодировке ASCII занимает 8 бит (1 байт), хотя может умещаться и в 7 бит.
  • Символ ISO-8895-1 в кодировке ISO-8859-1 составляет 8 бит (1 байт).
  • Символ Unicode в кодировке UTF-8 имеет длину от 8 бит (1 байт) до 32 бит (4 байта).
  • Символ Unicode в кодировке UTF-16 имеет размер от 16 (2 байта) до 32 бит (4 байта), хотя большинство общих символов занимают 16 бит. Это кодировка, используемая внутри Windows.
  • Символ Unicode в кодировке UTF-32 всегда имеет длину 32 бита (4 байта).
  • Символ ASCII в UTF-8 составляет 8 бит (1 байт), а в UTF-16 — 16 бит.
  • Дополнительные (не ASCII) символы в ISO-8895-1 (0xA0-0xFF) будут занимать 16 бит в UTF-8 и UTF-16.
person Taco タコス    schedule 10.08.2018

Программное обеспечение FTP обычно предлагает двоичный и текстовый режимы передачи. В текстовом режиме перевод строки происходит во время передачи. Это может быть достоверной информацией, в зависимости от того, в чем заключается ваша проблема и почему вы задали вопрос.

person thoni56    schedule 26.05.2010