trDWord ReadFile( trLpFile pFile ) {
trDWord dwResult = 0, dwCur = 0;
int iChar = 0, i = 0;
while ( !feof( pFile ) ) {
for( i = 0; i < 4; ++i ) {
iChar = fgetc( pFile );
if ( iChar != EOF ) {
if ( i ) {
dwCur <<= 8; // байты идут от старшего к младшему, значит и заполняем так же
}
dwCur |= iChar;
} else {
break;
}
}
if ( i == 4 ) {
m_szText += dwCur;
++dwResult;
dwCur = 0;
}
}
return dwResult;
} // trDWord ReadFile
Порядок байтов
Цитата:
Порядок байтов в integers и double-precision integers, составляющих описание данных в заголовке файла (определенном выше) и в содержимом строк в главном файле, - малый (PC или Intel). Порядок байтов в integers и double-precision integers, из которых состоит остаток файла, - большой (Sun или Motorola).
большой порядок байтов Порядок байтов слева направо в целых словах. Этот порядок используется во многих UNIX-системах, таких как Hewlett-Packard® , IBM® , SUN.
малый порядок байтов Порядок байтов справа налево в целых словах. Этот порядок используется многими операционными системами, включая DEC OSF/1™ , DEC Open VMS™ , MS-DOS® и Windows NT™ .
Каким образом получить число в привычном (малопорядочном:-) виде, имея число с большим порядком байтов?
Заранее спасибо!
Цитата: plastictown
Каким образом получить число в привычном (малопорядочном:-) виде, имея число с большим порядком байтов?
Как вариант использовать ntohl и функции из этого семейтсва.
Цитата: nikitozz
Как вариант использовать ntohl и функции из этого семейтсва.
Я посмотрел, они, вроде бы, принимают( и возвращают) unsigned аргумент. Мне надо signed.
Цитата: plastictown
Я посмотрел, они, вроде бы, принимают( и возвращают) unsigned аргумент. Мне надо signed.
покатит и для знаковых.
для 32х битных я, например, пользую ассемблерую bswap. для 16-ти - xchg
Для int ntohl() работает клево. А как быть с double?
Ну проинтерпретируйте как массив байт. Хотя может и для 8-байтных что-то есть - не вспомнить.
Если это именно обратный порядок байтов, то вообще пофиг какой тип конвертируется. Для компа это тупо область памяти заполненая нулями и единичками. Критична только ширина типа, т.к. разворачивается в обратном порядке не весь файл, а его компоненты, которые меняют свой внутренний порядок байтов, но при этом не меняют порядок следования в файле.
Всем спасибо! Буду пробовать.
Код:
Функция вернет количество считанных символов.
m_szText - полученный текст, содержащий символы как 4-х байтные коды (DWORD)
trDWord: typedef unsigned long trDWord;
Это только пример.
_Undead_: сейчас попробовать не могу, но, все равно, спасибо!