Почему C # Convert.ToBase64String () дает мне длину 88, когда я передаю 64 байта? - PullRequest
7 голосов
/ 02 февраля 2012

Я пытаюсь понять следующее:

Если я объявляю 64 байта в качестве длины массива (буфера).Когда я преобразую в строку со значением 64, она говорит, что длина равна 88. Разве длина не должна быть только 64, поскольку я передаю в 64 байтах?Я мог бы совершенно неправильно понять, как этот факт работает.Если да, не могли бы вы объяснить.

//Generate a cryptographic random number
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

// Create byte array
byte[] buffer = new byte[64];

// Get random bytes
rng.GetBytes(buffer);

// This line gives me 88 as a result. 
// Shouldn't it give me 64 as declared above?
throw new Exception(Convert.ToBase64String(buffer).Length.ToString());

// Return a Base64 string representation of the random number
return Convert.ToBase64String(buffer);

Ответы [ 3 ]

8 голосов
/ 02 февраля 2012

Нет, кодирование base-64 использует целый байт для представления шести битов кодируемых данных.Потерянные два бита - это цена использования только буквенно-цифровых символов плюс и косая черта в качестве символов (в основном, исключая числа, представляющие невидимые или специальные символы в простой кодировке ASCII / UTF-8).Результат, который вы получаете, (64 * 4/3) округляется до ближайшей 4-байтовой границы.

6 голосов
/ 02 февраля 2012

Кодировка Base64 преобразует 3 октета в 4 кодированных символа; следовательно

(64/3) * 4 ≈ (22 * 4) = 88 байт.

Читайте здесь.

2 голосов
/ 02 февраля 2012

Разве длина не должна быть только 64, поскольку я передаю 64 байта?

Нет. Вы передаете 64 токена в формате Base256. Base64 имеет меньше информации на токен, поэтому ему нужно больше токенов. 88 звучит о праве.

...