Страница 1 из 1
c++ и переменные
Добавлено: 14 фев 2004, 17:19
evbel
Такой вот вопрос:
как быстрее всего перебросить данные
из char[4] в int
или из char[2] в short
а также наоборот.
Добавлено: 14 фев 2004, 18:56
fa3a
atoi() не подходит???

Добавлено: 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 и обратно.
Пользуйся ими при записи в файл и при чтении.