Typecast кроссплатформенная совместимость - PullRequest
2 голосов
/ 16 мая 2010

я пытаюсь добавить двоичное целое число в строковый объект. Пока у меня есть это:

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

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

Ответы [ 2 ]

3 голосов
/ 16 мая 2010

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

1 голос
/ 16 мая 2010

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

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

Это зависит от того, что вы ожидаете от этого. Windows (обычно) работает на машинах little-endian , которые имеют 32-битные целые числа, что означает, что ваш код добавит 05 00 00 00 к вашей строке. Однако на машинах с прямым порядком байтов , которые также имеют 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);
}

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

...