Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: байты  (Прочитано 5004 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 23-12-2004 23:47 » 

Добрый день,

Имеется массив byte[] назовем его source, который имеет размерность N
Необходимо создать из вышеописанного массива другой массив target с размерностью M
Но так чтобы один traget соответсовал одному source

Посоветовали сделать это с помощью hash'ей
но не очень понимаю как это можно реализовать...
« Последнее редактирование: 19-12-2007 19:49 от Алексей1153++ » Записан
xelos
Гость
« Ответ #1 : 24-12-2004 14:33 » 

hash - это по аналогии с криптографией, как я понимаю, тебе посоветовали. Хэш может использоваться для выравнивания данных. Т.е. в криптографии, если у тебя пароль 4 знака - шифровать не очень хорошо, т.к. мало символов. Один из методов - создание salt и добавления его к паролю перед применением алгоритмов шифрования (хэшированию). В нэймспейсе System.Security.Cryptography посмотри.
некоторые алгоритмы шифрования позволяют получить на выходе строку заданной длины.

Конкртено по твоей задаче - М>N или как? какой алгоритм преобразования одного массива в другой?
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 24-12-2004 18:28 » 

какой алгоритм преобразования одного массива в другой?

вот его то и надо придумать... Улыбаюсь
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 24-12-2004 19:04 » 

Mfcer, ты имеешь в виду - из байтов сделать например DWORDы ?
Записан

Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #4 : 25-12-2004 15:42 » 

нужно сделать из одного количества байт byte сделать другое количество байт
или если говорить более конкретно
мне нужно из массива байт (заранее не известно какой у него размер, он читается из стрима) сделать определенное количество double'ов
« Последнее редактирование: 03-12-2007 17:39 от Алексей1153++ » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 25-12-2004 18:01 » 

Код:
#define N1 16
#define N2 (N1>>2);
BYTE Aby[N1];
double Adb[N2];
DWORD Adwd[N2];

//"переводим" из байтов в четырёхбайтные
DWORD i,count=0;
for(i=0;i<N1;i+=4)
{
   //для дворда
   Adwd[count]=(*((DWORD*)(Aby+i)));
   //для double
   Adb[count]=(*((double*)(Aby+i)));
}

так имхо...

только насчёт порядка для double - не знаю. Надеюсь ты расставишь
Для дворда - при условии, что младший байт дворда имеет более младший индекс в Aby

Записан

Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #6 : 25-12-2004 20:53 » 

а как такое заюзать на C#?
В си понятно, но указатели...Не понял
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 26-12-2004 14:50 » 

обана... не представляю бытовую жизнь без указателей Улыбаюсь

можно так:

Код:
#define N1 16
#define N2 (N1>>2);
BYTE Aby[N1];
double Adb[N2];
DWORD Adwd[N2];

//"переводим" из байтов в четырёхбайтные
DWORD i,count=0;
for(i=0;i<N1;i+=4)
{
   //для дворда
   Adwd[count]=(Abi[i]) |  (Abi[i+1]<<8) | (Abi[i+2]<<16) | (Abi[i+3]<<24)
   //для double - не знаю :) (см. ниже)
}

для дабл - без указателей никак...
можно было бы так: дворд собрали, а потом интерпретировать каждый дворд как дабл:

//double == *(  (double*) (&DWORD)  );

double D0 = *(  (double*)  (& (Adwd[0]) )     );
double D1 = *(  (double*)  (& (Adwd[1]) )     );

может и так прокатит (хотя сильно совнемаюсь):
double D2 = ( (double) Adwd[2] );
Записан

Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 26-12-2004 14:57 » 

блин, уплыли квадратные скобки...
Код:
double D0 = *(  (double*)  (& (Adwd[0] ) )     );
только я не понял, как пост исправить - или никак ещё?

Записан

xelos
Гость
« Ответ #9 : 13-01-2005 15:01 » 

насчет указателей - в C# любой тип пользователя создается в куче. Т.е. фактически, любое имя объекта - есть указатель (возможно я ошибаюсь, но обычно так, вроде), так же как и имя функции - вспомните делегатов.

Проблема состоит в том, что .НЕТ - типобезопасная платформа. Т.е. нужно определять как приводятся типы, платформа сама этого не сделает (если не использовать unsafe вызовы, которые введены для совместимости с С и С++).

Т.е. решение - создать свой класс, который будет включать методы преобразования типа (для DWORD есть вообще-то Int64).
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines