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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
#1

Конвертация байтов в Int16 - C++

15.06.2013, 16:39. Просмотров 807. Ответов 3
Метки нет (Все метки)

Подскажите мб команду и библиотеку ей соответствующую ...
Суть в чем: имеется массив байтов .. нужно получить массив чисел, каждое из которых представлено 2 байтами (последовательными).

Кусок кода:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        int minc = std::numeric_limits<char>::min();
    int mins = std::numeric_limits<short>::min();
    char *buffer=new char[image.GetBufferLength()]; 
    bool getedBuffer=image.GetBuffer( buffer); 
    std::cout<<"Buffer success: "<<getedBuffer<<std::endl;
    unsigned char * unsigbuf=new unsigned char [image.GetBufferLength()];
    
    for (unsigned int i=0; i<image.GetBufferLength();++i)
    {
        unsigbuf[i]=buffer[i]-minc;
    }
    
    unsigned char GetPix[2];
    unsigned short *pixels=new unsigned short [image.GetBufferLength()/2];
    unsigned int k;
    for (unsigned int i=0;i<image.GetBufferLength()/2;++i)
    {
        k=i*2;
        GetPix[0]=unsigbuf[k];
        GetPix[1]=unsigbuf[k+1];
        
        // конвертирование pixels[i]= (unsigned short)(BitConverter::ToINT16(GetPix,0)-mins);
 
    }
Кратко суть: беру буффер изображения, (знаю, что оно черно-белое и пиксель описан Int16), перевожу его в тип unsigned char .. далее пытаюсь получить из него последовательность значений unsigned short ... Вот запнулся на получении из 2 unsigned char 1 unsigned short...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2013, 16:39     Конвертация байтов в Int16
Посмотрите здесь:

порядок байтов - C++
Подскажите, пожалуйста, как записать целое число в битовый файл, чтобы на всех машинах оно считывалось бы с одинаковым порядком байт.

Перестановка байтов - C++
Задание: Определить объединение из двух полей. Первое поле - массив из 4 байт, второе двойное слово. Ввести случайное целое число в...

Порядок байтов - C++
Заранее извиняюсь если не туда пишу... Помогите определить порядок байтов: 01 00 00 00 71 82 3D 00 CB 82 3D 00 ED 68 4C 23...

Чтение байтов - C++
Ребят, здравствуйте , nомогите разобраться , есть бинарный файл , в нем данные заnисанные в структурах , и в файле 1-е 4 байта это кол-во...

Сумма байтов - C++
Всем доброго времени суток. Помогите пожалуйста. У меня задание: вычислить контрольную сумму последовательности байтов, ограниченной двумя...

Замена байтов/битов - C++
Здравствуйте. Помогите пожалуйста написать программу: нужно ввести последовательность из 8 целых чисел. Если число четное, то заменить его...

Сумма байтов числа - C++
Написать функцию, принимающую указатель на вещественную переменную типа float и возвращающую сумму составляющих это вещественное число...

Неправильное выделение байтов - C++
void *_upointer; int type:2; В классе присутствуют 2 переменные. Насколько я знаю, указатель занимает 4 байта, а int в данном случае...

Замена байтов в файле - C++
Есть программа написанная на MFC, вопрос как можно реализовать смену байтов в файле который она открывает если я знаю офсеты 0x000C92AE и...

реверсировать список байтов - C++
как сделать например из 01 02 03 04 ... это ... 04 03 02 01 ? :) void swapBytes( byte* v, size_t n ) { byte* in = v; ...

Сравнение байтов в bitset - C++
Помогите написать функцию, которая сравнивает байты (а точнее первые 3 бита в каждом байте bitset&lt;32&gt;) Просто кроме, как кейсом, ничего в...

Задать порядок байтов - C++
Нет ли в C++ какого-то штатного средства, позволяющего преобразовать порядок байт числа в &quot;от старшего к младшему&quot;? Понятно, что...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
15.06.2013, 16:47     Конвертация байтов в Int16 #2
А если в лоб сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    char buf[] = "aabbcc";
    unsigned short *ubuf = reinterpret_cast<unsigned short*>(buf);
 
    for (int i = 0; i < 3; ++i)
    {
        std::cout << ubuf[i] << std::endl;
    }
 
    return 0;
}
Небезопасно, зато одна строчка кода.
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
15.06.2013, 20:23  [ТС]     Конвертация байтов в Int16 #3
Цитата Сообщение от 0x10 Посмотреть сообщение
А если в лоб сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    char buf[] = "aabbcc";
    unsigned short *ubuf = reinterpret_cast<unsigned short*>(buf);
 
    for (int i = 0; i < 3; ++i)
    {
        std::cout << ubuf[i] << std::endl;
    }
 
    return 0;
}
Небезопасно, зато одна строчка кода.
Как вариант ... Только вот такие вот рассуждения .. -128, -128 - по идеи должно было бы дать мне 0 (поскольку-постольку минимум)... Однако оно мне дало число более 32000... Разве что к char "прибавить" минимум .. делая его unsigned .. а далее проблем не должно уже возникнуть...

Мб у кого-то есть более безопасная идея??

Добавлено через 3 часа 19 минут
Поскольку есть возможность проверить правильность визуально (собрал картинку обратно) .. то могу сказать, что конвертация "в одну строку" , предложенная пользователем 0х10, абсолютно правильно работает и безопасно.. если кому на будущее пригодится...
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.06.2013, 23:30     Конвертация байтов в Int16 #4
Цитата Сообщение от NativeLand Посмотреть сообщение
2 unsigned char 1 unsigned short...
C++
1
2
3
4
unsigned short convertToUShort(char[2] c)
{
    return *((unsigned short*) c);
}
Yandex
Объявления
15.06.2013, 23:30     Конвертация байтов в Int16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru