Кроссплатформенная (де) сериализация char * из файла - PullRequest
0 голосов
/ 23 августа 2011

Мне нужно fwrite a char * подать и fread это на другой платформе, где подпись char меняется.

  • Есть ли способы решить это иное , чем явная сериализация unsigned char*?
  • Всегда ли безопасно разыграть char* на unsigned char*?

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Эти две платформы должны в какой-то степени согласиться на представление char, чтобы вы могли перенести файл из одной в другую.

Так что не существует "полностью переносимого" способа сделатьэто - например, предположим, что char - это 16 бит на платформе, которая пишет, и 8 бит на платформе, которая читает, тогда, очевидно, вы не можете вообще передавать символы из одного в другой.Либо это вообще невозможно сделать (16-разрядный символ предлагает DSP, он может не иметь файлового или потокового ввода-вывода), либо есть какое-то согласованное правило, как преобразовать файл при его передаче.

Также должно быть либо соглашение о том, что такое набор символов выполнения, либо средство преобразования файла между (например) EBCDIC и ASCII.В противном случае запись a на одной стороне не приведет к прочтению a на другой.

Как только вы установили правила соответствия char на каждой стороне, это говорит вамчто вы можете читать и писать.Если разница only состоит в том, что подпись char изменяется, но они оба используют один и тот же набор символов, просто проверьте, соответствует ли подписанный знак отрицательным значениям.

Предполагая, что это такТаким образом, единственным общепринятым способом (дополнение к двум), и предположим, что обе стороны преобразуют целые числа без знака в целые числа со знаком единственным общепринятым способом (заново интерпретируют битовый шаблон), тогда вы можете просто читать и писать char обычно с обеих сторонс фактически теми же результатами, что и приведение между unsigned char и signed char.

1 голос
/ 23 августа 2011

В C это безопасно для доступа любого типа как unsigned char [sizeof T];это называется представление .Вопрос в том, сохранит ли копирование этого представления между различными системами значение .Вот соответствующие факты / проблемы:

  • Все положительные значения char (и имейте в виду, что все символы в базовом наборе символов выполнения должны быть положительными) имеют то же представление, что и unsigned char с тем же значением(То же самое относится и к другим целочисленным типам со знаком и без знака.)
  • В системе с двойным дополнением типы со знаком и без знака char полностью совместимы (по модулю разницы в интерпретации значений), и этосовершенно безопасно, чтобы получить доступ к ним как любой тип.Более того, стандарт C затрудняет, если не делает невозможным, создание действительной реализации, в которой подпись char подписана, а не дополняется двумя, и я думаю, можно с уверенностью сказать, что такая реализация не существует или никогда не будет существовать.
  • Даже если значения как char (это целые числа!) Сохраняются при переносе файла в другую систему, это не обязательно означает, что идентификаторы символов будут сохранены, поскольку целевая система можетиспользуйте другую кодировку символов (EBCDIC puke ..).

Это много глупостей, но результат, который вы должны убрать, заключается в том, что если вашей целью не является педантизм и языковая адвокатура, естьне о чем беспокоиться.Просто используйте fwrite и fread непосредственно для строк и не беспокойтесь о том, были ли они unsigned char[] или char[] строками.

1 голос
/ 23 августа 2011

Если вы «сериализуете» символы без отрицательных, это не имеет значения.В противном случае это не имеет смысла (поскольку вы не сможете определить, какое значение было записано).

...