Страница 1 из 1

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

Добавлено: 14 фев 2004, 17:19
evbel
Такой вот вопрос:
как быстрее всего перебросить данные
из char[4] в int
или из char[2] в short
а также наоборот.

Добавлено: 14 фев 2004, 18:56
fa3a
atoi() не подходит??? :shock:

Добавлено: 14 фев 2004, 19:07
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;
}

Добавлено: 14 фев 2004, 21:25
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);

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

Добавлено: 16 фев 2004, 14:32
Гость
тогда немного другой вопрос!
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: Важна скорость считывания.

Добавлено: 16 фев 2004, 15:24
exe
Гость,

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

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

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