Не могу решить головоломку
От: UNI_X Россия  
Дата: 03.11.06 11:01
Оценка:
Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00). Вобщем я не знаю, как значения этих байтов привести к такому виду. Что было понятнее, приведу парочку примеров:
  • 1
    HEX 2B A5 91 43 (тут собственно и есть эти 4 байта)
    DEC 43 165 145 67 (это для удобства в DEC перевел, хотя мне эти числа время ну никак не напоминают)


    => 00:04:51 — а вот это время, которое представлено вышеуказанными байтами

  • 2
    HEX 8A 9B A5 42
    DEC 138 155 165 66


    => 00:01:22

  • 3
    HEX F6 E1 9E 44
    DEC 246 225 158 68


    => 00:21:11

    Никак не могу уловить по какой логике это время кодируется. Помогите пожалуйста.
  • Я бы изменил мир, но бог не даёт исходники!
    Re: Не могу решить головоломку
    От: Garrett Россия  
    Дата: 03.11.06 11:58
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00).


    Уверен что оно представляется именно в этом виде?
    Обычно время представляется как количество стандартных интервалов, прошедших с какого-то момента.
    в борьбе со здравым смыслом победа будет за нами!
    Re[2]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 03.11.06 12:07
    Оценка:
    Здравствуйте, Garrett, Вы писали:

    G>Здравствуйте, UNI_X, Вы писали:


    UNI>>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00).


    G>Уверен что оно представляется именно в этом виде?

    Да уверен. На 100%
    G>Обычно время представляется как количество стандартных интервалов, прошедших с какого-то момента.
    Обычно да, но не в этом случае.
    Я бы изменил мир, но бог не даёт исходники!
    Re[2]: Не могу решить головоломку
    От: Роман Дубров Украина Я@Blogspot
    Дата: 03.11.06 12:21
    Оценка:
    Garrett пишет:

    > Обычно время представляется как количество стандартных интервалов,

    > прошедших с какого-то момента.

    на просто число интервалов не похоже — порядок чисел с величинами их
    времени не коррелирует.

    2UNI_X: порядок байт правильный или какой есть?

    на BCD тоже не похоже... и не битовая структура...
    в общем хз... мож на краклаб закинуть?

    --
    np: [foobar2000] 10. Within Temptation — Perfect Harmony [paused]
    Posted via RSDN NNTP Server 2.1 beta
    http://www.linkedin.com/in/romandubrov .::. http://roman-dubrov.blogspot.com/ .::. http://www.flickr.com/photos/romandubrov/
    Re[3]: Не могу решить головоломку
    От: Garrett Россия  
    Дата: 03.11.06 12:21
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Здравствуйте, Garrett, Вы писали:


    G>>Здравствуйте, UNI_X, Вы писали:


    UNI>>>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00).


    G>>Уверен что оно представляется именно в этом виде?

    UNI>Да уверен. На 100%
    G>>Обычно время представляется как количество стандартных интервалов, прошедших с какого-то момента.
    UNI>Обычно да, но не в этом случае.

    Тогда давай еще статистику
    в борьбе со здравым смыслом победа будет за нами!
    Re: Не могу решить головоломку
    От: CiViLiS Россия  
    Дата: 03.11.06 12:31
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00). Вобщем я не знаю, как значения этих байтов привести к такому виду. Что было понятнее, приведу парочку примеров:

    Хм никакой корреляции не вижу.. Возможно время представлено в вещественном формате.. Например целая часть -- это минуты, дробная это доли минуты...

    Нужна дополнительная инфа. Например откуды это числа.. Если выдраны из дебага какой то проги, то желательно знать на чем написана это программа и т.д.
    ... << RSDN@Home 1.2.0 alpha rev. 655>>
    "Бог не терпит голой сингулярности" -- Роджер Пенроуз
    Re[2]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 03.11.06 13:50
    Оценка:
    Здравствуйте, CiViLiS, Вы писали:

    CVL>Здравствуйте, UNI_X, Вы писали:


    UNI>>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00). Вобщем я не знаю, как значения этих байтов привести к такому виду. Что было понятнее, приведу парочку примеров:

    CVL>Хм никакой корреляции не вижу.. Возможно время представлено в вещественном формате.. Например целая часть -- это минуты, дробная это доли минуты...

    Вот это интересное предположение. Я в торопях забыл совсем сказать, что тип этих данных float (32-х битный).

    CVL>Нужна дополнительная инфа. Например откуды это числа.. Если выдраны из дебага какой то проги, то желательно знать на чем написана это программа и т.д.

    Не знаю чем может помочь инфа о том, на каком языке написана прога (в любом случае я точно не знаю, скорее всего на C). Если подробнее, то прога эта называется Half Life, все наверное знают... даже если и не геймеры. Вобщем речь тут идет о CS (Counter Strike). Я пишу прогу, предоставляющую некоторую информацию о сервере CS. Есть возможность показать сколько времени каждый из игроков находится на сервере. Вобщем, послыая некоторый запрос серверу CS, я получаю от него ответ, в котором содержится информация о игроках, в том числе и время. Вот как только его к нормальному виду привести не знаю.

    2CiViLiS:
    Кстати, а что значит правильный порядок байт? Выше ты спрашивал: "порядок байт правильный или какой есть?" Я с байтами ничего не делал, как они в пакете шли, так я их и представил вам, так что это скорее всего "как есть", но всё равно интересно что значит "правильный порядок"?
    Я бы изменил мир, но бог не даёт исходники!
    Re[3]: Не могу решить головоломку
    От: ДимДимыч Украина http://klug.org.ua
    Дата: 03.11.06 15:16
    Оценка: 2 (1)
    Здравствуйте, UNI_X, Вы писали:

    UNI>Вот это интересное предположение. Я в торопях забыл совсем сказать, что тип этих данных float (32-х битный).


    Ну, с этого и надо было начинать

        union
        {
            float f;
            unsigned int i;
        } x;
        
    //    x.i = 0x4391A52B;
    //    x.i = 0x42A59B8A;
        x.i = 0x449EE1F6;
    
        float f = x.f / 60;
    
        printf("%u:%u:%u\n", (int)f / 60, (int)f % 60, (int)(60*(f - floorf(f))));
    Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
    Re[4]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 03.11.06 15:41
    Оценка:
    Здравствуйте, ДимДимыч, Вы писали:

    ДД>Здравствуйте, UNI_X, Вы писали:


    UNI>>Вот это интересное предположение. Я в торопях забыл совсем сказать, что тип этих данных float (32-х битный).


    ДД>Ну, с этого и надо было начинать


    ДД>
    ДД>    union
    ДД>    {
    ДД>        float f;
    ДД>        unsigned int i;
    ДД>    } x;
        
    ДД>//    x.i = 0x4391A52B;
    ДД>//    x.i = 0x42A59B8A;
    ДД>    x.i = 0x449EE1F6;
    
    ДД>    float f = x.f / 60;
    
    ДД>    printf("%u:%u:%u\n", (int)f / 60, (int)f % 60, (int)(60*(f - floorf(f))));
    ДД>

    Вот спасибо тебе. Я бы наверное ещё долго думал над тем, что это такое
    Я бы изменил мир, но бог не даёт исходники!
    Re[3]: Не могу решить головоломку
    От: Jax Россия  
    Дата: 03.11.06 15:43
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Кстати, а что значит правильный порядок байт? Выше ты спрашивал: "порядок байт правильный или какой есть?" Я с байтами ничего не делал, как они в пакете шли, так я их и представил вам, так что это скорее всего "как есть", но всё равно интересно что значит "правильный порядок"?


    Порядок байтов. Ключевые слова: little-endian и big-endian.
    Re[4]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 04.11.06 11:22
    Оценка:
    Тут небольшая проблемка снова возникла по этой же теме. Вобщем мне нужно те 4 байта сначала из строки выдернуть, прежде чем с ними работаеть, и вот тут что-то не сходится.
        union
        {
            float f;
            unsigned int i;
        } x;
        int x1 = 0, x2 = 0, x3 = 0, x4 = 0;
        float f = 0;
        unsigned int hh = 0, mm = 0, ss = 0;
        char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0};   //00:04:51
    
            x1 = (int)str[0];
            x2 = (int)str[1];
            x3 = (int)str[2];
            x4 = (int)str[3];
            //если задавать х таким образом то ответ получается неверный (0:1:12)
            x.i = x1 + x2 * 256 + x3 * 65536 + x4 * 16777216;
            f = x.f / 60;
            hh = (int)f / 60;
            mm = (int)f % 60;
            ss = (int)(60*(f - floorf(f)));
    
        printf("%u:%u:%u\n", hh, mm, ss);

    Пожскажите пожалуйста как тут быть?
    Я бы изменил мир, но бог не даёт исходники!
    Re[5]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 08.11.06 16:38
    Оценка:
    Проблему эту никак решить не могу. Немного изменю вопрос, может быть станет яснее. Как из элементов строкового массива получить вот такую запись: x.i = 0x449EE1F6. Проще говоря из этого: char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это: x.i = 0x449EE1F6
    Я бы изменил мир, но бог не даёт исходники!
    Re[6]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 08.11.06 16:49
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Проблему эту никак решить не могу. Немного изменю вопрос, может быть станет яснее. Как из элементов строкового массива получить вот такую запись: x.i = 0x449EE1F6. Проще говоря из этого: char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это: x.i = 0x449EE1F6

    Что-то я тут напутал. Вот так правильнее будет сказать. Как из такой записи x.i = 0x4391A52B, получить вот такую: char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0};
    Я бы изменил мир, но бог не даёт исходники!
    Re[7]: Не могу решить головоломку
    От: UNI_X Россия  
    Дата: 08.11.06 16:51
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Здравствуйте, UNI_X, Вы писали:


    UNI>>Проблему эту никак решить не могу. Немного изменю вопрос, может быть станет яснее. Как из элементов строкового массива получить вот такую запись: x.i = 0x449EE1F6. Проще говоря из этого: char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это: x.i = 0x449EE1F6

    UNI>Что-то я тут напутал. Вот так правильнее будет сказать. Как из такой записи x.i = 0x4391A52B, получить вот такую: char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0};
    Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.
    Я бы изменил мир, но бог не даёт исходники!
    Re[8]: Не могу решить головоломку
    От: ДимДимыч Украина http://klug.org.ua
    Дата: 09.11.06 08:54
    Оценка: 6 (1)
    Здравствуйте, UNI_X, Вы писали:

    UNI>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.


    x.i = *(unsigned int *)str;
    Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
    Re[8]: Не могу решить головоломку
    От: Jax Россия  
    Дата: 09.11.06 09:19
    Оценка:
    Здравствуйте, UNI_X, Вы писали:

    UNI>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.


    Например так:

        typedef unsigned long ulong;
        ulong result = 0;
        char str[4] = {0x2B, 0xA5, 0x91, 0x43};
    
        /* вар. 1 */
        result = str[0];
        result |= (((ulong)str[1]) << 8) & 0x0000ff00;
        result |= (((ulong)str[2]) << 16) & 0x00ff0000;
        result |= (((ulong)str[3]) << 24) & 0xff000000;
    
        /* вар. 2 */
        result = str[0];
        result |= (str[1] << 8) & 0x0000ff00;
        result |= (str[2] << 16) & 0x00ff0000;
        result |= (str[3] << 24) & 0xff000000;
    
        /* вар. 3 */
        result = str[0];
        result += (str[1] << 8) & 0x0000ff00;
        result += (str[2] << 16) & 0x00ff0000;
        result += (str[3] << 24) & 0xff000000;


    Мне больше нравится второй.
    Re[9]: Не могу решить головоломку
    От: Jax Россия  
    Дата: 09.11.06 09:33
    Оценка:
    Здравствуйте, ДимДимыч, Вы писали:

    ДД>Здравствуйте, UNI_X, Вы писали:


    UNI>>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.


    ДД>
    ДД>x.i = *(unsigned int *)str;
    ДД>


    Круто! Но работать на PowerPC, например, это не будет...
    Re[9]: Не могу решить головоломку
    От: Кодт Россия  
    Дата: 09.11.06 10:19
    Оценка: 5 (1)
    Здравствуйте, ДимДимыч, Вы писали:

    UNI>>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.


    Т.е. в строке записано little-endian 4-байтное число.

    ДД>
    ДД>x.i = *(unsigned int *)str;
    ДД>


    Это справедливо в том случае, когда хост тоже little-endian (например, x86).
    В общем же случае нужно конструировать
    x.i = make_dword(str[0], str[1], str[2], str[3]);
    // где
    inline unsigned long make_dword(unsigned char c0, unsigned char c1, unsigned char c2, unsigned char c3)
    {
        return ((unsigned long)c0) | ((unsigned long)c1<<8) | ((unsigned long)c2<<16) | ((unsigned long)c3<<24);
    }

    Обрати внимание, что char сперва приводится к unsigned char — в противном случае приведение к long расширит знаковый бит в старшие биты, и, например, из 0x82 вместо 0x00000082 получишь 0xFFFFFF82.
    ... << RSDN@Home 1.2.0 alpha rev. 655>>
    Перекуём баги на фичи!
    Re[10]: Не могу решить головоломку
    От: ДимДимыч Украина http://klug.org.ua
    Дата: 09.11.06 10:45
    Оценка:
    Здравствуйте, Jax, Вы писали:

    ДД>>
    ДД>>x.i = *(unsigned int *)str;
    ДД>>


    Jax>Круто! Но работать на PowerPC, например, это не будет...


    Я знаю. Но вряд ли Counter Strike будут запускать на PowerPC. Да и насчет идентичности формата float'а в PowerPC и x87 я не совсем уверен.
    Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
    Re[10]: Не могу решить головоломку
    От: ДимДимыч Украина http://klug.org.ua
    Дата: 09.11.06 10:51
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К>Это справедливо в том случае, когда хост тоже little-endian (например, x86).


    Это понятно. Но как я понял, задача изначально подразумевает идентичноть порядков байт.
    Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.