Сериализация RSAParameters
От: Аноним  
Дата: 04.08.10 10:03
Оценка:
Нашел класс на просторах инета — http://www.icsharpcode.net/CodeReader/SharpDevelop/087b/Core/CoreUtilRSASignatureGenerator.cs.html Никак не могу понять смысл мега хакерских операций вида:

if (array == null || array.Length == 0) {
  for (int i = 0; i < 4; ++i) {
    writer.WriteByte(0);
  }
  return;
}

int length = array.Length;
for (int i = 0; i < 4; ++i) {
  writer.WriteByte((byte)((length & (0xFF << (8 * i))) >> (8 * i)));
}


Почему нельзя просто записать признак null ввиде bool значения, и явно указать длину массива? Это особенность Rsa?
Re: Сериализация RSAParameters
От: Jolly Roger  
Дата: 04.08.10 10:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему нельзя просто записать признак null ввиде bool значения, и явно указать длину массива? Это особенность Rsa?


Что значит "записать признак null ввиде bool значения" я, признаться, не понял, как и то, зачем они так записывают ноль. А длину так пишут, чтобы гарантировать little-endian формат числа независимо от текущей аппаратной платформы.
"Нормальные герои всегда идут в обход!"
Re: Сериализация RSAParameters
От: Niswn  
Дата: 04.08.10 10:31
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Нашел класс на просторах инета — http://www.icsharpcode.net/CodeReader/SharpDevelop/087b/Core/CoreUtilRSASignatureGenerator.cs.html Никак не могу понять смысл мега хакерских операций вида:


А>
А>if (array == null || array.Length == 0) {
А>  for (int i = 0; i < 4; ++i) {
А>    writer.WriteByte(0);
А>  }
А>  return;
А>}

А>int length = array.Length;
А>for (int i = 0; i < 4; ++i) {
А>  writer.WriteByte((byte)((length & (0xFF << (8 * i))) >> (8 * i)));
А>}
А>


А>Почему нельзя просто записать признак null ввиде bool значения, и явно указать длину массива? Это особенность Rsa?


К RSA данный код не имеет никакого отношения. Единственное, что он делает, это записывает длину массива в файл. Длина массива число типа int (4 байта), FileStream.WriteByte может записать только один байт.
Ну а дальше всё просто. Если длина массива 0 или null, то записываем 4 нулевых байта, что равносильно записи числа int, равного 0. Если длина массива не 0, то разбиваем длину на 4 байта и записываем их поочередно.
Код:

writer.WriteByte((byte)((length & (0xFF << (8 * i))) >> (8 * i)));

берет очередной байт числа и записывает его в файл.
ICQ: 326084932
Re[2]: Сериализация RSAParameters
От: Аноним  
Дата: 04.08.10 11:09
Оценка:
Здравствуйте, Niswn, Вы писали:

N>К RSA данный код не имеет никакого отношения. Единственное, что он делает, это записывает длину массива в файл. Длина массива число типа int (4 байта), FileStream.WriteByte может записать только один байт.


Ок, спасибо за ответы. Я со своими extension методами совсем из жизни выпал, что в поток можно писать лишь байты. У меня код переписанный выглядит так:

private static void WriteByteArray(Stream stream, byte[] array)
{
    if (stream == null)
        throw new ArgumentNullException("stream");

    stream.Write(array == null);

    if (array == null)
        return;

    stream.Write(array);
}

private static byte[] ReadByteArray(Stream stream)
{
    if (stream == null)
        throw new ArgumentNullException("stream");

    var isNull = stream.Read<bool>();

    if (isNull)
        return null;

    return stream.Read<byte[]>();
}
Re[2]: Сериализация RSAParameters
От: Jolly Roger  
Дата: 05.08.10 15:16
Оценка:
Здравствуйте, Niswn, Вы писали:

N>Длина массива число типа int (4 байта), FileStream.WriteByte может записать только один байт.


А использовать Stream.Write(byte[] array, int offset, int count) им Бендер не велел?
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.