Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кодировка цветов в Web, востановление алгоритма раскодировки 
:(
    Опции темы
stab
Дата 22.11.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Столкнулся с такой проблемой, на одном сайте пользователям разрешено вводить цвета строчкой, т.е. #FFFFFF - белый. Ограничений на вводимые данные никаких нет и пользователи навводили всякой фигни, вроде #RED666 и #YEWTE7, браузеры каким-то непонятным образом из этого вытягивают цвета #0ED666 и #0E00E7, и эти цвета устраивают пользователей, т.е. они их вроде как подобрали получается.

Встала задача привести их к нормальному виду не теряя информации. Никак не могу понять какой алгоритм применяется браузерами для вычленения цвета из этого мусора, например #YE6WTEZ34Y270F = #0E0E40.

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  colors.gif 4,83 Kb


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Walker
Дата 22.11.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: нет
Всего: 16



Цитата

#RED666 и #YEWTE7

Цитата

#0ED666 и #0E00E7


На первый взгляд, всё, что непонятно (> F), равно 0.

Цитата

#YE6WTE4Y270F

Цитата

#0E0E40

 smile  smile 

Это сообщение отредактировал(а) Walker - 22.11.2007, 12:30


--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
stab
Дата 22.11.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



ага, меня тоже последний вариант в ступор вогнал.  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
maxim1000
Дата 22.11.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(stab @  22.11.2007,  12:05 Найти цитируемый пост)
RED666 


Цитата(stab @  22.11.2007,  12:05 Найти цитируемый пост)
YEWTE7


вообще наводит на мысли RED - красный, YE - жёлтый, WTE - белый
может, они это имели в виду? smile


--------------------
qqq
PM WWW   Вверх
stab
Дата 22.11.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



maxim1000, да кто их знает что они там имеют в виду. Браузер явно это понимает не так, но как?! smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
AlexST
Дата 24.11.2007, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 30.4.2006
Где: Москва

Репутация: нет
Всего: 3



stab, кинь ещё длинных примеров, типа последнего.
PM MAIL ICQ   Вверх
stab
Дата 25.11.2007, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



AlexST, поэкспериментируй с обычным html файлом и фотошоповской пипеткой.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
AlexST
Дата 26.11.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 30.4.2006
Где: Москва

Репутация: нет
Всего: 3



В Opera чётко видно: каждый неизвестный символ заменен на 0 (ну она всегда более логично работала smile ).
YE6WTE4Y270F = 0e600e (именно так у меня)
7ghjrk380mtg750f =700000
w1w1w1w1w1w1 = 010101
0YE6 = 00e600 но YE6 = 000e06
но принцип явно можно использовать (какие-то ошибки с маленькими строками начинаются).

ИЕ и FF отжигают ужасно. Чем больше вариантов, тем непонятней (но т. к. они более популярны, именно так обрабатывать надо). smile

YE6WTE4Y270F  = 0e0e27
Y6WTE4Y270F = 06e470
7ghjrk380mtg750f = 703875
YE66 = 0e6600 но YE6 = 000e06
w111 = 011100
w1w1 = 010100 но w1w1w1w1 = 011001
w1w1w1w1w1w1 = 101010

Четкой логической закономерности не прослеживается, только общие принципы видны.
Кажется код плохой и в результате мусор.
PM MAIL ICQ   Вверх
stab
Дата 27.11.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



придётся скачать исходники ФФ.  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 28.11.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



в общем выкопал код из ФФ:

Код

extern "C" NS_GFX_(PRBool) NS_LooseHexToRGB(const nsString& aColorSpec, nscolor* aResult)
{
  // XXXldb nsStackString<30>
  NS_LossyConvertUCS2toASCII buffer(aColorSpec);

  int nameLen = buffer.Length();
  const char* colorSpec = buffer.get();
  if ('#' == colorSpec[0]) {
    ++colorSpec;
    --nameLen;
  }

  if (3 < nameLen) {
    // Convert the ascii to binary
    int dpc = (nameLen / 3) + (((nameLen % 3) != 0) ? 1 : 0);
    if (4 < dpc) {
      dpc = 4;
    }

    // Translate components from hex to binary
    int r = ComponentValue(colorSpec, nameLen, 0, dpc);
    int g = ComponentValue(colorSpec, nameLen, 1, dpc);
    int b = ComponentValue(colorSpec, nameLen, 2, dpc);
    NS_ASSERTION((r >= 0) && (r <= 255), "bad r");
    NS_ASSERTION((g >= 0) && (g <= 255), "bad g");
    NS_ASSERTION((b >= 0) && (b <= 255), "bad b");
    if (nsnull != aResult) {
      *aResult = NS_RGB(r, g, b);
    }
  }
  else {
    if (nsnull != aResult) {
      *aResult = NS_RGB(0, 0, 0);
    }
  }
  return PR_TRUE;
}

static int ComponentValue(const char* aColorSpec, int aLen, int color, int dpc)
{
  int component = 0;
  int index = (color * dpc);
  if (2 < dpc) {
    dpc = 2;
  }
  while (--dpc >= 0) {
    char ch = ((index < aLen) ? aColorSpec[index++] : '0');
    if (('0' <= ch) && (ch <= '9')) {
      component = (component * 16) + (ch - '0');
    } else if ((('a' <= ch) && (ch <= 'f')) || 
               (('A' <= ch) && (ch <= 'F'))) {
      // "ch&7" handles lower and uppercase hex alphabetics
      component = (component * 16) + (ch & 7) + 9;
    }
    else {  // not a hex digit, treat it like 0
      component = (component * 16);
    }
  }
  return component;
}

#define NS_RGB(_r,_g,_b) \
  ((nscolor) ((255 << 24) | ((_b)<<16) | ((_g)<<8) | (_r)))


как видно, все сложности у нас возникли из-за странной группировки на равные компоненты, хотя из каждой группы учитываются только два первых символа. на C# получилось немного кривовато, но работает так же как ФФ:

Код

public static class StringWebColorsEx
{
    public static Color ToColor(this string colorString)
    {
        int componentsLength = colorString.Length;
        int startIndex = 0;

        if (!string.IsNullOrEmpty(colorString) && colorString[0] == '#')
        {
            startIndex++;
            componentsLength--;
        }

        if (componentsLength > 3)
        {
            int charsPerComponent = componentsLength / 3 + (((componentsLength % 3) != 0) ? 1 : 0);
            if (charsPerComponent > 4)
            {
                charsPerComponent = 4;
            }

            int r = GetComponent(colorString, startIndex, 0, charsPerComponent);
            int g = GetComponent(colorString, startIndex, 1, charsPerComponent);
            int b = GetComponent(colorString, startIndex, 2, charsPerComponent);

            return Color.FromArgb((0xFF << 24) | (r << 16) | (g << 8) | b);
        }
        else
        {
            return Color.Black;
        }
    }

    private static int GetComponent(string colorString, int startIndex, int component,
        int charsPerComponent)
    {
        int value = 0;
        int index = startIndex + component * charsPerComponent;

        if (charsPerComponent > 2)
        {
            charsPerComponent = 2;
        }

        while (charsPerComponent > 0)
        {
            char digitChar = (index < colorString.Length) ?
                char.ToUpper(colorString[index]) : '0';

            value *= 16;
            if (digitChar >= '0' && digitChar <= '9')
            {
                value += (digitChar - '0');
            }
            else if (digitChar >= 'A' && digitChar <= 'F')
            {
                value += (digitChar - 'A' + 10);
            }

            index++;
            charsPerComponent--;
        }

        return value;
    }
}



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.