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

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

ru
Offline Offline

WWW
« : 03-06-2009 02:34 » 

Как преобразовать четыре байта в 32-битовое целое число со знаком средствами «Borland C++Builder 6»  Не понял
Помогите, пожалуйста, новичку…
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-06-2009 03:27 » 

FanatWin, что это за байты?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 03-06-2009 05:20 » 

Код:
char raw_data[] = {0x34, 0xA4, 0xB4, 0xC4 };
long result = *reinterpret_cast<long *>(raw_data);
Записан

Странно всё это....
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 03-06-2009 07:54 » 

Я бы, честно говоря, предпочёл старый добрый memcpy или его заменители. Потому что reinterpret_cast ненадёжен, да и любой _cast может привести к проблемам, если будут какие-нибудь кренделя с выравниванием памяти.
Код:
long result;
char raw_data[] = {0x34, 0xA4, 0xB4, 0xC4 };
memcpy(&result, raw_data, sizeof(result));
Записан
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #4 : 03-06-2009 09:37 » 

FanatWin, что это за байты?

Извиняюсь, что конкретней не указал, что мне надо.
Вообще, надо написать функцию, являющеюся аналогом «BitConverter.ToInt32» (Visual Studio NET но на C++) то есть: возвратить 32-битовое целое число со знаком, преобразованное из четырех байтов с указанной позицией в массив байтов….
А как это сделать я слабо представляю, точнее не представляю вообще…
Записан

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

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


« Ответ #5 : 03-06-2009 09:48 » 

FanatWin сделай так

Код:
	#pragma pack(push,1)
union u_myDWORD
{
struct
{
   BYTE m_by0;
   BYTE m_by1;
   BYTE m_by2;
   BYTE m_by3;
};
DWORD m_dwd;

u_myDWORD()
{
m_dwd=0;
}
};
#pragma pack(pop)


u_myDWORD d;

d.m_by0=...;
d.m_by1=...;
d.m_by2=...;
d.m_by3=...;

или так

Код:
DWORD dwd=0;
*(0+(BYTE*)&dwd)=...; //0-й байт
*(1+(BYTE*)&dwd)=...; //1-й байт
*(2+(BYTE*)&dwd)=...; //2-й байт
*(3+(BYTE*)&dwd)=...; //3-й байт
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 03-06-2009 12:36 » 

Я бы, честно говоря, предпочёл старый добрый memcpy или его заменители. Потому что reinterpret_cast ненадёжен, да и любой _cast может привести к проблемам, если будут какие-нибудь кренделя с выравниванием памяти.
может быть Улыбаюсь
тогда так:
Код:
long Raw2long(const char * data)
{
   long result = 0;
   std::copy(data, data + sizeof(long), reinterpret_cast<char *>(&result));
   return 0;
}
тут не может быть проблем с выравниванием, т.к. long приводится к char, а не наоборот Улыбаюсь кроме того внутри это преобразуется memcpy
Записан

Странно всё это....
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #7 : 04-06-2009 02:18 » new

Всем:
Огромное спасибо, вы мне очень помогли...
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines