Форум программистов, компьютерный форум CyberForum.ru

Преобразование типа byte в десятичный - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
Ortistx
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
08.03.2011, 22:34     Преобразование типа byte в десятичный #1
Здравствуйте!

Читаю файл побайтово, записал в переменную byte a[2] соответственно 2 байта, которые находятся в 16ричной системе. В этих 2х байтах лежит размер. Так вот, мне нужно узнать этот размер в десятичной системе счисления. Подскажите пожалуйста как это сделать.

Например, число 4F12h.
Есть ли какая-нибудь стандартная функция. Калькулятором перевести могу, но нужно в коде на с++.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2011, 22:34     Преобразование типа byte в десятичный
Посмотрите здесь:

C++ Преобразование типа переменной
C++ Последовательность после обработки надо записать в массив типа BYTE
Преобразование типа C++
Преобразование типа C++
C++ Неявное преобразование типа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ortistx
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 21:02  [ТС]     Преобразование типа byte в десятичный #21
У меня как раз little endian и чтобы ее использовать, я до ее вызова переставил байты местами. Это правильно так делать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.03.2011, 21:04     Преобразование типа byte в десятичный #22
Цитата Сообщение от GAME Посмотреть сообщение
тогда уж short. Потому-что инт имеет размер 4 байта.
это не страшно - запишется куда надо
Цитата Сообщение от Ortistx Посмотреть сообщение
У меня как раз little endian и чтобы ее использовать, я до ее вызова переставил байты местами. Это правильно так делать?
нет, она как раз и предназначена, чтобы так не делать и вообще об этом не думать )
Ortistx
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 21:13  [ТС]     Преобразование типа byte в десятичный #23
А как, она сама определит какой порядок байтов?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.03.2011, 21:22     Преобразование типа byte в десятичный #24
Ortistx, а я подумал - без разницы в int'e такой же порядок байтов, поэтому она тупо копирует
Ortistx
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 21:41  [ТС]     Преобразование типа byte в десятичный #25
Понтно. Спасибо, alex_x_x
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,693
11.03.2011, 22:19     Преобразование типа byte в десятичный #26
Цитата Сообщение от alex_x_x Посмотреть сообщение
Цитата Сообщение от Ortistx Посмотреть сообщение
У меня как раз little endian и чтобы ее использовать, я до ее вызова переставил байты местами. Это правильно так делать?
нет, она как раз и предназначена, чтобы так не делать и вообще об этом не думать )
Как-то странно все это. Функция memcpy тупо копирует последовательность байтов, следовательно число, записанное этой функцией в массив байтов, будет совпадать с прочитанным ею из этого массива, если запись и чтение производились на одной и той же платформе. Стандарт же файла
Цитата Сообщение от Ortistx Посмотреть сообщение
jpeg-файл
по идее не должен зависеть от платформы. Может быть все-таки выяснить что и куда там пишется?
Ortistx
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 22:24  [ТС]     Преобразование типа byte в десятичный #27
Попробовал, если не менять байты местами, то выводится неправильное значение.

по идее не должен зависеть от платформы
да, так и есть.
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
11.03.2011, 22:25     Преобразование типа byte в десятичный #28
Цитата Сообщение от Mr.X Посмотреть сообщение
Как-то странно все это. Функция memcpy тупо копирует последовательность байтов
да. всё так. Будь там LE или BE ей всё равно... она же только копирует байты и всё.
А в памяти, как я понимаю, байты идут так
X - char
XX - short
XXXX - int

То есть, если два char'a подряд получается шорт или инт(если остальные были обнулены)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.03.2011, 22:33     Преобразование типа byte в десятичный #29
дык какой в стандарте порядок?
Ortistx
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 22:44  [ТС]     Преобразование типа byte в десятичный #30
В стандарте jpeg порядок байт в 2-байтовых переменных отличается от Intel-стандарта, то есть сначала пишется старший байт, затем младший.
Насколько я знаю это порядок байт motorola'вский.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.03.2011, 23:05     Преобразование типа byte в десятичный #31
те little-endian
на x86 тоже little-endian
проблем не должно быть

Добавлено через 8 минут
кстати для преобразования BE<->LE есть нестандартные функции

C
1
2
3
4
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
25.04.2011, 23:39     Преобразование типа byte в десятичный #32
Вот для этого и придуманы объединения
например так
C++
1
2
3
4
5
6
7
union MyUninon
{
 unsigned char byte_size[2];
  short  short_size; 
} MyUnionTypes;
fread(MyUnionTypes.byte_size, 1, 2, f);
printf( "%d", MyUnionTypes.short_size);
Добавлено через 41 секунду
http://www.cyberguru.ru/programming/...ls-page14.html
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
26.04.2011, 14:20     Преобразование типа byte в десятичный #33
Цитата Сообщение от Ortistx Посмотреть сообщение
GAME, не работает.
Вывожу cout<<num; выдает 0012FF18
num в том примере - это указатель. Надо выводить "cout << *num;"

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
например так
При условии, что порядок байтов, в котором хранится числов файле, совпадает с порядком байтов, в котором работает машина. Твой код будет работать по разному на машинах little-endian и big-endian. Потому что объединение для little-endian и для big-endian должно выглядеть по разному

Добавлено через 13 минут
Вот пример кода

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int main (void)
{
  union
  {
    unsigned char c[2];
    unsigned short s;
  } u;
 
  /* Пишем ручками в массив. Этот процесс будет совпадать с процессом чтения
   * из файла: сначала прочтётся элемент c[0], а потом c[1] */
  u.c[0] = 0x12;
  u.c[1] = 0x34;
 
  /* Распечатаем число, которое соотвествует образу, прочитанному из файла.
   * Если мы образ из файла напрямую кладём в память, то при таком раскладе
   * результат будет зависетьот endian машины, на которой исполняется код */
  printf ("Result1 = 0x%x\n", u.s);
 
  /* Теперь используем интерфейс htons. Он устроен так, что на машинах
   * с big-endian он не изменяет число, а на машинах с little-endian
   * разворачивает байты. В качестве результирующего порядка является
   * network order. Здесь уже на всех endian'ах получим одинаковый результат.
   * Но такой результат всегда будет совпадать с результатом из первого
   * примера для big-endian машин */
  printf ("Result2 = 0x%x\n", htons (u.s));
 
  return 0;
}
Результат исполнения на i386 (little-endian):

Код
Result1 = 0x3412
Result2 = 0x1234
Результат исполнения на sparc (big-endian):

Код
Result1 = 0x1234
Result2 = 0x1234
Видно, что при использовании htons мы имеем одинаковый результат для любого endian'а. Поскольку у Ortistx'а порядок записи байтов в файле является big-endian, то htons его устроит. Если бы порядок был little-endian, то после применения htons пришлось ещё ручками байты разворачивать (для этого вроде бы интерфейс есть, но не помню, как называется)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
26.04.2011, 19:26     Преобразование типа byte в десятичный #34
развернуть байты не самая большая проблемма
например
C++
1
2
3
4
5
unsigned short Revers(unsigned short value)
{
unsigned short tmp=((value<<8)&0xFF00)|((value>>8)&0xFF);
return tmp;
}
можно и без маски поскольку беззнаковое то при сдвиге вправо слева будут 0.
По моему есть даже такие Макросы которые меняют порядок байт (я всегда писал вручную).

Цитата Сообщение от Evg Посмотреть сообщение
интерфейс htons
а как он узнает нужно менять байты или нет?

Добавлено через 2 минуты
Я вообще-то писал про объединения для того что не нужно напрягаться все уже придумано
А про порядок байт вроде уже объяснили

Добавлено через 1 минуту
И вообще почему бы не задать структуру
и считать сразу все значения
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2011, 19:38     Преобразование типа byte в десятичный
Еще ссылки по теме:

Преобразование типа C++
C++ Преобразование String в Byte C++
C++ Преобразование из HEX в BYTE

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
26.04.2011, 19:38     Преобразование типа byte в десятичный #35
Цитата Сообщение от ValeryS Посмотреть сообщение
а как он узнает нужно менять байты или нет?
Сам интерфейс ничего не знает. Знают те, кто этот интерфейс реализовывает. На big-endian машинах он реализован так, что ничего не делает, на little-endian - разворачивает. Это забота разработчиков системной библиотеки, а не забота пользователей

Цитата Сообщение от ValeryS Посмотреть сообщение
И вообще почему бы не задать структуру
и считать сразу все значения
Человек только учится. А начинать надо с малого. Разберётся в вопросе, дальше проще будет
Yandex
Объявления
26.04.2011, 19:38     Преобразование типа byte в десятичный
Ответ Создать тему
Опции темы

Текущее время: 07:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru