Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39

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

08.03.2011, 22:34. Показов 6419. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

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

Например, число 4F12h.
Есть ли какая-нибудь стандартная функция. Калькулятором перевести могу, но нужно в коде на с++.
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2011, 22:34
Ответы с готовыми решениями:

Глупый человек ищет умную мысль при сравнения массива типа byte с маскй типа byte.
Прошу помощи в виде объяснения в следующем вопросе. на вход программы поступает array of byte. Требуется просто напросто сравнить...

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE OnReceivePacket( /* */ long dwSize, ...

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции. Вот пример кода, который нужно справить: ...

34
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 21:02  [ТС]
Студворк — интернет-сервис помощи студентам
У меня как раз little endian и чтобы ее использовать, я до ее вызова переставил байты местами. Это правильно так делать?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 21:04
Цитата Сообщение от GAME Посмотреть сообщение
тогда уж short. Потому-что инт имеет размер 4 байта.
это не страшно - запишется куда надо
Цитата Сообщение от Ortistx Посмотреть сообщение
У меня как раз little endian и чтобы ее использовать, я до ее вызова переставил байты местами. Это правильно так делать?
нет, она как раз и предназначена, чтобы так не делать и вообще об этом не думать )
0
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 21:13  [ТС]
А как, она сама определит какой порядок байтов?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 21:22
Ortistx, а я подумал - без разницы в int'e такой же порядок байтов, поэтому она тупо копирует
0
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 21:41  [ТС]
Понтно. Спасибо, alex_x_x
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
11.03.2011, 22:19
Цитата Сообщение от alex_x_x Посмотреть сообщение
Цитата Сообщение от Ortistx Посмотреть сообщение
У меня как раз little endian и чтобы ее использовать, я до ее вызова переставил байты местами. Это правильно так делать?
нет, она как раз и предназначена, чтобы так не делать и вообще об этом не думать )
Как-то странно все это. Функция memcpy тупо копирует последовательность байтов, следовательно число, записанное этой функцией в массив байтов, будет совпадать с прочитанным ею из этого массива, если запись и чтение производились на одной и той же платформе. Стандарт же файла
Цитата Сообщение от Ortistx Посмотреть сообщение
jpeg-файл
по идее не должен зависеть от платформы. Может быть все-таки выяснить что и куда там пишется?
2
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 22:24  [ТС]
Попробовал, если не менять байты местами, то выводится неправильное значение.

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

То есть, если два char'a подряд получается шорт или инт(если остальные были обнулены)
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 22:33
дык какой в стандарте порядок?
0
1 / 1 / 0
Регистрация: 19.02.2011
Сообщений: 39
11.03.2011, 22:44  [ТС]
В стандарте jpeg порядок байт в 2-байтовых переменных отличается от Intel-стандарта, то есть сначала пишется старший байт, затем младший.
Насколько я знаю это порядок байт motorola'вский.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 23:05
те 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);
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
25.04.2011, 23:39
Вот для этого и придуманы объединения
например так
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/progra... age14.html
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.04.2011, 14:20
Цитата Сообщение от 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):

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

Code
1
2
Result1 = 0x1234
Result2 = 0x1234
Видно, что при использовании htons мы имеем одинаковый результат для любого endian'а. Поскольку у Ortistx'а порядок записи байтов в файле является big-endian, то htons его устроит. Если бы порядок был little-endian, то после применения htons пришлось ещё ручками байты разворачивать (для этого вроде бы интерфейс есть, но не помню, как называется)
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
26.04.2011, 19:26
развернуть байты не самая большая проблемма
например
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 минуту
И вообще почему бы не задать структуру
и считать сразу все значения
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.04.2011, 19:38
Цитата Сообщение от ValeryS Посмотреть сообщение
а как он узнает нужно менять байты или нет?
Сам интерфейс ничего не знает. Знают те, кто этот интерфейс реализовывает. На big-endian машинах он реализован так, что ничего не делает, на little-endian - разворачивает. Это забота разработчиков системной библиотеки, а не забота пользователей

Цитата Сообщение от ValeryS Посмотреть сообщение
И вообще почему бы не задать структуру
и считать сразу все значения
Человек только учится. А начинать надо с малого. Разберётся в вопросе, дальше проще будет
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2011, 19:38

Преобразование двоичного кода в двоично-десятичный (PIC16F84)
Здравствуйте, вот задание: Декодирование входного 5-битного двоичного кода в 8-битный двоично-десятичный Я новичок в ассеблере, только...

Преобразование BYTE C++
Здравствуйте! Столкнулся с такой проблемой, не могу вызвать функцию такого типа &quot;bool function (BYTE bytes1,BYTE bytes2)&quot;из DLL...

Преобразование типа или преобразование типа указателя ?
Добрый день. Помогите пожалуйста понять что делает вот эта команда: out.write ((char *) &amp;n, sizeof n); Она что, перед записью в...

Преобразование String в Byte C++
как преобразовать массив из string (или только string) в byte? допустим, есть массив: string word; string mas; ...

Преобразование данных в byte[]
Здравствуйте! Часто сталкивался с проблемой при записи данных в файл или передачи через сокеты: данные можно передавать только в виде byte....


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные. . . .
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Написать программу вычисления стоимости некоторого количества (по весу) яблок. Решение: Создан документ, с табличной частью. . .
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru