2010-05-16 5 views
2

то, что я пытаюсь сделать, это добавить двоичное целое в строковый объект. До сих пор у меня есть это:Совместимость между платформами Typecast

int number = 5; 
cppstring.append((char*)&number, 4); 

Это прекрасно работает на x86 системах с Windows, но некоторые люди говорят, что его не кросс-платформенный и небезопасно. Каков предпочтительный метод для этого?

ответ

3

Причина, по которой он не переносится, заключается в том, что ints не всегда 4 байта. Например, модель данных ILP64 использует 8-байтовые int. C99 требует только, чтобы ints составлял не менее 2 байтов. Зачем вам это нужно, и каково желаемое поведение, если размер int не равен 4 байтам?

+0

Содержимое строкового объекта должно храниться в файле данных и содержать целые числа, которые должна считываться программой. – kaykun

+1

Тогда вам, вероятно, нужно определить целое число фиксированного размера для формата файла и использовать соответствующий тип (например, int32_t) во всей вашей программе. –

1

Это всегда обычно работают, независимо от платформы, вы находитесь на, если, работая просто значит «не крах». EDIT Я пропустил аргумент sizestring::append, так что он может на самом деле сбить или дать странные результаты из-за переполнения буфера на платформах, где int s не имеют 4 байта.

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

Это зависит от того, что вы ожидаете от этого. Windows (обычно) работает на машинах little-endian с 32-битными целыми числами, что означает, что ваш код добавит 05 00 00 00 к вашей строке. Однако на машинах big-endian, которые также имеют 32-битные целые числа, ваш код добавит 00 00 00 05 к строке. Хуже того, ваш код может работать на платформах с 16-битными целыми числами, которые добавят 00 05.

В зависимости от того, какого поведения вы хотите, это может быть хорошей идеей, чтобы реализовать «менее волшебный» способ добавляемых байт, как for цикла, который знает он хочет добавить 4 байта в прямом порядке байты моды :

int number = 5; 
for(int i = 0; i < 4; i++) 
{ 
    char numberByte = (number >> (8 * i)) & 0xFF; 
    cppstring.append(&numberByte, 1); 
} 

Таким образом, вы будете уверены, что результаты будут соответствовать на разных платформах, так как код не зависит ни от размера целого, ни порядка байтов.

+0

Возможно, это может привести к сбою, поскольку тип int может быть 16-разрядным. –

Смежные вопросы