Мне предстоит написать несколько программ на C, которые будут работать на различных *nix платформах (как довольно редких, так и более распространненых). Эти программы среди прочего будут обрабатывать двоичные данные. Не очень богатый опыт программирования на C имеется, но нехватает знаний о том, как учитывать разницу в реализации скалярных типов данных на разных программно-аппаратных платформах. Поделитесь, пожалуйста, ссылками на статьи по данной тематике.
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,порядок следования байтов и др.
Здравствуйте, catap, Вы писали:
C>Вообще, насколько я знаю, Си далек от порядка байт,ю их размера и чего бы то C>ни было еще. Т.е. если int a = 3; то он на всех платформах будет более менее C>эквивалентен (имеется ввиду что a будет иметь значение 3, если оно влезет в C>этот int конечно ).
C>А что тебе собственно надо от типов данных?
Для примера, в обрабатываемом двоичном файле в начале каждой записи есть 128 бит флагов, которые показывают наличие/отсутствие полей в записи. Хранится это все дело в "серверном" порядке сделования байт. Под Linux IA32 (программа была написана на FreePascal) Я самостоятельно преобразовывал это значение в 2 значения int64. Как мне поступить в данном случае, учитывая, что моя программа может работать как на платформах с "серверным" порядком байт, так и на IA32/IA64?
Re: типы данных C, порядок следования байтов и др.
Здравствуйте, app_error, Вы писали:
_>Для примера, в обрабатываемом двоичном файле в начале каждой записи есть 128 бит флагов, которые показывают наличие/отсутствие полей в записи. Хранится это все дело в "серверном" порядке сделования байт. Под Linux IA32 (программа была написана на FreePascal) Я самостоятельно преобразовывал это значение в 2 значения int64. Как мне поступить в данном случае, учитывая, что моя программа может работать как на платформах с "серверным" порядком байт, так и на IA32/IA64?
Обычно этот порядок байт все же именуют сетевым. Для преобразования используют функции hton(l,s) и ntoh(l,s). Но правда они расчитаны только на 16-ти и 32-х битные типы.
Re: типы данных C, порядок следования байтов и др.
Здравствуйте, app_error, Вы писали:
_>Мне предстоит написать несколько программ на C, которые будут работать на различных *nix платформах (как довольно редких, так и более распространненых). Эти программы среди прочего будут обрабатывать двоичные данные. Не очень богатый опыт программирования на C имеется, но нехватает знаний о том, как учитывать разницу в реализации скалярных типов данных на разных программно-аппаратных платформах. Поделитесь, пожалуйста, ссылками на статьи по данной тематике.
Здравствуйте, DOOM, Вы писали:
DOO>Здравствуйте, netch80, Вы писали: N>>Здравствуйте, app_error, Вы писали: DOO>[skipped] DOO>Ну тогда уж ASN.1, ИМХО, прогрессивнее :)
Для него надо отдельно ставить код, а сериализаторы сложнее.
The God is real, unless declared integer.
Re[3]: типы данных C,порядок следования байтов и др.
Здравствуйте, app_error, Вы писали:
_>Здравствуйте, catap, Вы писали:
C>>Вообще, насколько я знаю, Си далек от порядка байт,ю их размера и чего бы то C>>ни было еще. Т.е. если int a = 3; то он на всех платформах будет более менее C>>эквивалентен (имеется ввиду что a будет иметь значение 3, если оно влезет в C>>этот int конечно ).
C>>А что тебе собственно надо от типов данных?
_>Для примера, в обрабатываемом двоичном файле в начале каждой записи есть 128 бит флагов, которые показывают наличие/отсутствие полей в записи. Хранится это все дело в "серверном" порядке сделования байт. Под Linux IA32 (программа была написана на FreePascal) Я самостоятельно преобразовывал это значение в 2 значения int64. Как мне поступить в данном случае, учитывая, что моя программа может работать как на платформах с "серверным" порядком байт, так и на IA32/IA64?
...
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: