типы данных C, порядок следования байтов и др.
От: app_error Украина http://www.bestsell.kiev.ua
Дата: 26.11.06 12:57
Оценка:
Мне предстоит написать несколько программ на C, которые будут работать на различных *nix платформах (как довольно редких, так и более распространненых). Эти программы среди прочего будут обрабатывать двоичные данные. Не очень богатый опыт программирования на C имеется, но нехватает знаний о том, как учитывать разницу в реализации скалярных типов данных на разных программно-аппаратных платформах. Поделитесь, пожалуйста, ссылками на статьи по данной тематике.
Re: типы данных C,порядок следования байтов и др.
От: catap Россия http://catap.ru/
Дата: 26.11.06 14:26
Оценка:
app_error @ Sun, 26 Nov 2006 12:57:10 GMT:

a> Мне предстоит написать несколько программ на C, которые будут работать на различных *nix платформах (как довольно редких, так и более распространненых). Эти программы среди прочего будут обрабатывать двоичные данные. Не очень богатый опыт программирования на C имеется, но нехватает знаний о том, как учитывать разницу в реализации скалярных типов данных на разных программно-аппаратных платформах. Поделитесь, пожалуйста, ссылками на статьи по данной тематике.


Статьи с ходу не дам, но еще кениган и ритчи в своей книги писали байку о том,
как им пришлось решать задача при переносе с одной платформы на другую, когда
там был другой порядок байт

Вообще, насколько я знаю, Си далек от порядка байт,ю их размера и чего бы то
ни было еще. Т.е. если int a = 3; то он на всех платформах будет более менее
эквивалентен (имеется ввиду что a будет иметь значение 3, если оно влезет в
этот int конечно ).

А что тебе собственно надо от типов данных?

--

.''`. Kirill A. Korinskiy <catap@catap.ru>
: :' : proud maniac programmer
`. `'` http://catap.ru/ — +7 (916) 3-604-704 — xmpp:catap@catap.ru
`- Debian — when you have better things to do than fixing systems (c)madduck
Posted via RSDN NNTP Server 2.1 beta
...а в ответ ему посмотрела пустота...
Re[2]: типы данных C,порядок следования байтов и др.
От: app_error Украина http://www.bestsell.kiev.ua
Дата: 26.11.06 14:44
Оценка:
Здравствуйте, catap, Вы писали:

C>Вообще, насколько я знаю, Си далек от порядка байт,ю их размера и чего бы то

C>ни было еще. Т.е. если int a = 3; то он на всех платформах будет более менее
C>эквивалентен (имеется ввиду что a будет иметь значение 3, если оно влезет в
C>этот int конечно ).

C>А что тебе собственно надо от типов данных?


Для примера, в обрабатываемом двоичном файле в начале каждой записи есть 128 бит флагов, которые показывают наличие/отсутствие полей в записи. Хранится это все дело в "серверном" порядке сделования байт. Под Linux IA32 (программа была написана на FreePascal) Я самостоятельно преобразовывал это значение в 2 значения int64. Как мне поступить в данном случае, учитывая, что моя программа может работать как на платформах с "серверным" порядком байт, так и на IA32/IA64?
Re: типы данных C, порядок следования байтов и др.
От: Kubyshev Andrey  
Дата: 26.11.06 15:00
Оценка: 3 (1)
man htonl и дальше по теме ...
Re[3]: типы данных C,порядок следования байтов и др.
От: DOOM Россия  
Дата: 27.11.06 04:12
Оценка:
Здравствуйте, app_error, Вы писали:

_>Для примера, в обрабатываемом двоичном файле в начале каждой записи есть 128 бит флагов, которые показывают наличие/отсутствие полей в записи. Хранится это все дело в "серверном" порядке сделования байт. Под Linux IA32 (программа была написана на FreePascal) Я самостоятельно преобразовывал это значение в 2 значения int64. Как мне поступить в данном случае, учитывая, что моя программа может работать как на платформах с "серверным" порядком байт, так и на IA32/IA64?


Обычно этот порядок байт все же именуют сетевым. Для преобразования используют функции hton(l,s) и ntoh(l,s). Но правда они расчитаны только на 16-ти и 32-х битные типы.
Re: типы данных C, порядок следования байтов и др.
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 27.11.06 07:42
Оценка:
Здравствуйте, app_error, Вы писали:

_>Мне предстоит написать несколько программ на C, которые будут работать на различных *nix платформах (как довольно редких, так и более распространненых). Эти программы среди прочего будут обрабатывать двоичные данные. Не очень богатый опыт программирования на C имеется, но нехватает знаний о том, как учитывать разницу в реализации скалярных типов данных на разных программно-аппаратных платформах. Поделитесь, пожалуйста, ссылками на статьи по данной тематике.


man xdr.
Если нет мана в системе —
http://www.freebsd.org/cgi/man.cgi?query=xdr&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+6.1-RELEASE&amp;format=html

оно само тебе всё сделает, только оформи правильно:)
XDR есть практически везде — как часть Sun RPC
The God is real, unless declared integer.
Re[2]: типы данных C, порядок следования байтов и др.
От: DOOM Россия  
Дата: 27.11.06 10:21
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, app_error, Вы писали:


[skipped]

Ну тогда уж ASN.1, ИМХО, прогрессивнее
Re[3]: типы данных C, порядок следования байтов и др.
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 27.11.06 10:40
Оценка:
Здравствуйте, DOOM, Вы писали:

DOO>Здравствуйте, netch80, Вы писали:

N>>Здравствуйте, app_error, Вы писали:
DOO>[skipped]
DOO>Ну тогда уж ASN.1, ИМХО, прогрессивнее :)

Для него надо отдельно ставить код, а сериализаторы сложнее.
The God is real, unless declared integer.
Re[3]: типы данных C,порядок следования байтов и др.
От: MaximE Великобритания  
Дата: 28.11.06 08:57
Оценка:
Здравствуйте, app_error, Вы писали:

_>Здравствуйте, catap, Вы писали:


C>>Вообще, насколько я знаю, Си далек от порядка байт,ю их размера и чего бы то

C>>ни было еще. Т.е. если int a = 3; то он на всех платформах будет более менее
C>>эквивалентен (имеется ввиду что a будет иметь значение 3, если оно влезет в
C>>этот int конечно ).

C>>А что тебе собственно надо от типов данных?


_>Для примера, в обрабатываемом двоичном файле в начале каждой записи есть 128 бит флагов, которые показывают наличие/отсутствие полей в записи. Хранится это все дело в "серверном" порядке сделования байт. Под Linux IA32 (программа была написана на FreePascal) Я самостоятельно преобразовывал это значение в 2 значения int64. Как мне поступить в данном случае, учитывая, что моя программа может работать как на платформах с "серверным" порядком байт, так и на IA32/IA64?


Скопируй linux kernel макросы:

http://www.linuxjournal.com/article/5783#N0x850ca00.0x8573ef0

...
Thankfully, there are a number of helpful macros that have been created to make this an easy task. All of the following macros can be found in the asm/byteorder.h header file.

To convert from the processor's native format into little-endian form you can use the following functions:

u64 cpu_to_le64 (u64);
u32 cpu_to_le32 (u32);
u16 cpu_to_le16 (u16);


To convert from little-endian format into the processor's native format you should use these functions:

u64 le64_to_cpu (u64);
u32 le32_to_cpu (u32);
u16 le16_to_cpu (u16);


For big-endian forms, the following functions are available:

u64 cpu_to_be64 (u64);
u32 cpu_to_be32 (u32);
u16 cpu_to_be16 (u16);
u64 be64_to_cpu (u64);
u32 be32_to_cpu (u32);
u16 be16_to_cpu (u16);

...

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.