Здравствуйте, UNI_X, Вы писали:
UNI>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.
x.i = *(unsigned int *)str;
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
UNI>>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.
Т.е. в строке записано little-endian 4-байтное число.
ДД>
ДД>x.i = *(unsigned int *)str;
ДД>
Это справедливо в том случае, когда хост тоже little-endian (например, x86).
В общем же случае нужно конструировать
Обрати внимание, что char сперва приводится к unsigned char — в противном случае приведение к long расширит знаковый бит в старшие биты, и, например, из 0x82 вместо 0x00000082 получишь 0xFFFFFF82.
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
Никак не могу уловить по какой логике это время кодируется. Помогите пожалуйста.
Здравствуйте, UNI_X, Вы писали:
UNI>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00).
Уверен что оно представляется именно в этом виде?
Обычно время представляется как количество стандартных интервалов, прошедших с какого-то момента.
Здравствуйте, Garrett, Вы писали:
G>Здравствуйте, UNI_X, Вы писали:
UNI>>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00).
G>Уверен что оно представляется именно в этом виде?
Да уверен. На 100% G>Обычно время представляется как количество стандартных интервалов, прошедших с какого-то момента.
Обычно да, но не в этом случае.
Здравствуйте, UNI_X, Вы писали:
UNI>Здравствуйте, Garrett, Вы писали:
G>>Здравствуйте, UNI_X, Вы писали:
UNI>>>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00).
G>>Уверен что оно представляется именно в этом виде? UNI>Да уверен. На 100% G>>Обычно время представляется как количество стандартных интервалов, прошедших с какого-то момента. UNI>Обычно да, но не в этом случае.
Здравствуйте, UNI_X, Вы писали:
UNI>Hi All! Такая проблема, вобщем имеется 4 байта, которые содержат информацию о времени (не важно каком времени, важно знать, что время представлено в виде 00h 00m 00s или 00:00:00). Вобщем я не знаю, как значения этих байтов привести к такому виду. Что было понятнее, приведу парочку примеров:
Хм никакой корреляции не вижу.. Возможно время представлено в вещественном формате.. Например целая часть -- это минуты, дробная это доли минуты...
Нужна дополнительная инфа. Например откуды это числа.. Если выдраны из дебага какой то проги, то желательно знать на чем написана это программа и т.д.
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Здравствуйте, 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: Кстати, а что значит правильный порядок байт? Выше ты спрашивал: "порядок байт правильный или какой есть?" Я с байтами ничего не делал, как они в пакете шли, так я их и представил вам, так что это скорее всего "как есть", но всё равно интересно что значит "правильный порядок"?
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, UNI_X, Вы писали:
UNI>>Вот это интересное предположение. Я в торопях забыл совсем сказать, что тип этих данных float (32-х битный).
ДД>Ну, с этого и надо было начинать
ДД>
Здравствуйте, UNI_X, Вы писали:
UNI>Кстати, а что значит правильный порядок байт? Выше ты спрашивал: "порядок байт правильный или какой есть?" Я с байтами ничего не делал, как они в пакете шли, так я их и представил вам, так что это скорее всего "как есть", но всё равно интересно что значит "правильный порядок"?
Порядок байтов. Ключевые слова: little-endian и big-endian.
Тут небольшая проблемка снова возникла по этой же теме. Вобщем мне нужно те 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:51x1 = (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);
Проблему эту никак решить не могу. Немного изменю вопрос, может быть станет яснее. Как из элементов строкового массива получить вот такую запись: x.i = 0x449EE1F6. Проще говоря из этого: char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это: x.i = 0x449EE1F6
Здравствуйте, 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};
Здравствуйте, 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 Вот это точно правильный вопрос.
Здравствуйте, 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;
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, UNI_X, Вы писали:
UNI>>Не не не, опять не то. Наоборот... вот из этого char str[5] = {0x2B, 0xA5, 0x91, 0x43, 0}; получить вот это x.i = 0x4391A52B Вот это точно правильный вопрос.
ДД>
ДД>x.i = *(unsigned int *)str;
ДД>
Круто! Но работать на PowerPC, например, это не будет...