c++ и переменные

Все о программировании под *nix
evbel

c++ и переменные

Сообщение evbel »

Такой вот вопрос:
как быстрее всего перебросить данные
из char[4] в int
или из char[2] в short
а также наоборот.

Аватара пользователя
fa3a
Неотъемлемая часть форума
Сообщения: 619
Зарегистрирован: 25 июл 2003, 17:22
Откуда: Minsk

Сообщение fa3a »

atoi() не подходит??? :shock:
Never touch the running program!!!

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Сообщение kas »

Код: Выделить всё

#include <iostream>

int main(void)
{
  char a[4] = {'1','2','3','4'};
  char b[2] = {'1','2'};
  int c;
  short d;

  c = *((int*)a);
  d = *((short*)b);
  strncpy(a, (char*)&c, 4);
  strncpy(b, (char*)&d, 2);
  std::cout << c << std::endl;
  std::cout << d << std::endl;
  std::cout << a[0] << a[1] << a[2] << a[3] << std::endl;
  std::cout << b[0] << b[1] << std::endl;
  return 0;
}
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Вообще если по сети передавать планируешь, то есть макросы:
htons, htonl, ntohs, ntohl

Можешь ипользовать union, но это непереносимо на
другие архитектуры.

union toInt
{
char data[4];
int val; // short, long
};

Будь осторожен, int бывает от 2 до 8 байт (может и больше, не встречал).
Есть только одно правило:

sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

Вставь у себя в коде, если я правильно догадался про твою
архитектуру

assert(sizeof(int) == 4);
assert(sizeof(short) == 2);

Или поменяй на свои значения

Гость

Сообщение Гость »

тогда немного другой вопрос!
char ch1[8];
short sh;
base_ifstream<char> file("1.dat");
file.read((char*)(ch1),sizeof(ch));
file.read((char*)(&sh),sizeof(sh));
^^^^^
Проблема в том, что при записи в sh значение переворачивается, т.е. первый байт из файла считывается в МЛАДШИЙ байт sh, а второй (т.к. sizeof(short)==2)
- в старший байт, может кто знает как сделать считывание правильным?
PS: Важна скорость считывания.

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Гость,

Именно для такого использования и изобретены макросы
htons, htonl, ntohs, ntohl :)

Они переводят данные в network format и обратно.

Пользуйся ими при записи в файл и при чтении.

Ответить