crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> использование ntohs в Qt под линух
dimon11782
  опции профиля:
сообщение 7.5.2010, 20:03
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.4.2010
Пользователь №: 1628

Спасибо сказали: 0 раз(а)




Репутация:   0  


считал из сетевого буфера данные – допустим одно значение типа unsigned short = 0xFF35:
могу обращаться (считать значение) к его байтам:

char *buf[100];

*((unsigned char*)&buf)
*((unsigned char*)&buf+1)


Мне надо перевернуть данное число (0xFF35) – хочу воспользоваться функцией ntohs…
Но как мне корректно задать параметр у этой функции? Само число я не имею, а имею только адреса ячеек памяти, где оно лежит – то есть надо как-то “сложить” его 2 разряда (см. код выше) и взять от этого дела ntohs…Как это сделать? И желательно получить (оставить) это число в 16-ричной системе счисления - в итоге должно получиться 0x35FF…
И вообще – в линуксе (пишу под Qt 4.6) есть функции ntohl, ntohs??? какой у них инклудник?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 7.5.2010, 21:18
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Смотри: #include <netinet/in.h>
В нем обьявлены:
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.5.2010, 23:28
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


это явно не Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dimon11782
  опции профиля:
сообщение 8.5.2010, 22:14
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.4.2010
Пользователь №: 1628

Спасибо сказали: 0 раз(а)




Репутация:   0  


ViGOur: понятно...а как мне решить обозначенную в начале темы задачку "объединения байтов для взятия от них ntohl-функции"?
Litkevich Yuriy: что значит "это явно не Qt"? в нем нельзя использовать эти функции?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.5.2010, 22:19
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dimon11782 @ 9.5.2010, 2:14) *
Litkevich Yuriy: что значит "это явно не Qt"? в нем нельзя использовать эти функции?
ровно то что написал. Но если написанное мной столь не очевидно. Попробую добавить буковок:
"эти функции не являются частью Qt."

Следовательно место темы выбрано не правильно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dimon11782
  опции профиля:
сообщение 8.5.2010, 22:26
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.4.2010
Пользователь №: 1628

Спасибо сказали: 0 раз(а)




Репутация:   0  


так что по поводу решения обозначенной в начале темы проблемы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.5.2010, 22:42
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dimon11782 @ 8.5.2010, 0:03) *
Само число я не имею, а имею только адреса ячеек памяти, где оно лежит – то есть надо как-то ”сложить” его 2 разряда (см. код выше)
всё таки байта?
Вообще задачка по Си простейшая.
char *buf[100]; // Если данные лежат так:  0xFF35 -> 0x35 0xFF
unsigned short  res;
unsigned char tmp;
tmp = (unsigned char)*buf[i]; // берём 0x35
res = ((unsigned short)tmp) << 8; // двигаем 0x35 на 8 бит влево, чтобы было старшим байтом
tmp = (unsigned char)*buf[i+1]; // берём 0xFF
res |= tmp; // дописываем в младший байт 0xFF
// теперь res = 0x35FF
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 9.5.2010, 1:36
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


<QtEndian> - Endian Conversion Functions
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dimon11782
  опции профиля:
сообщение 10.5.2010, 0:19
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.4.2010
Пользователь №: 1628

Спасибо сказали: 0 раз(а)




Репутация:   0  


Litkevich Yuriy: да с самодельным примером мне все понятно - но уж коли для таких целей уже есть стандартные функции, то почему бы ими не воспользоваться и зачем городить свои?

igor_bogomolov: дайте пож-та пример чик на использование приведенных В Вашей ссылке методов для перекрутки числа, допустим, 0xFF92 (я что-то не совсем понял какая из приведенных в ссылке функций за что отвечает и как ее надо корректно использовать?)...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.5.2010, 0:52
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


#include <QtEndian>
#include <cstdio>

int main()
{
    int bigEndian = 0xFF92;
    int litleEndian = qFromBigEndian(bigEndian);

    printf("bigEndian = %#x \n", bigEndian);
    printf("litleEndian = %#x \n", litleEndian);

    return 0;
}


Цитата(вывод)
bigEndian = 0xff92
litttleEndian = 0x92ff0000
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.11.2019, 1:45