short
s обычно два байта и 16 бит. Когда вы говорите:
short s;
((char*)&s)[0] = 0x00;
((char*)&s)[1] = 0x1f;
Это устанавливает первый из этих двух байтов в 0x00
и второй из этих двух байтов в 0x1f
. Дело в том, что в C++ не указывается, какая настройка первого или второго байта соответствует значению полного short
, поэтому разные платформы могут делать разные вещи. В частности, некоторые платформы говорят, что установка первого байта влияет на «самые важные» биты 16 бит short
, а установка второго байта влияет на «наименее значимые» биты 16 бит short
. Другие платформы говорят наоборот; Эта настройка первого байта влияет на младшие значащие биты, а установка второго байта влияет на наиболее значимые биты. Эти два поведения платформы называются big-endian и little-endian соответственно.
Решение, чтобы получить последовательное поведение независимо от этих различий не доступ к байт short
таким образом. Вместо этого вы должны просто манипулировать значением short
, используя методы, которые определяют , например, с побитовыми и арифметическими операторами.
short s;
s = (0x1f << 8) | (0x00 << 0); // set the most significant bits to 0x1f and the least significant bits to 0x00.
Проблема заключается в том, что, по многим причинам, я могу только изменить тело функции F2. Я не могу изменить его прототип. Есть ли способ найти размер Y перед тем, как он был заперт или что-то еще?
Вы не можете определить оригинальный тип и размер, используя только char*
. Вы должны знать правильный тип и размер с помощью других средств. Если F2
никогда не вызывается, кроме как с CustomStruct, то вы можете просто бросить char*
обратно CustomStruct
так:
void F2(char* Y)
{
CustomStruct *X = (CustomStruct*)Y;
X->Element[0] = 0x1F00;
}
Но помните, что такие забросы не являются безопасными в целом; вы должны только вернуть указатель к тому, из чего он был изначально выбран.
Большое спасибо. Проблема в том, что по многим причинам я могу только изменить тело функции F2. Я не могу изменить его прототип. Есть ли способ найти размер Y перед тем, как он был заперт или что-то еще? –
Если вы знаете, что вы всегда будете передавать адрес короткого замыкания на F2, вы можете указать его параметр на короткий внутри тела функции и присвоить ему значение. Это сделает его совместимым с другими видами использования этой памяти в вашей программе как краткое, но потенциально несовместимым с обменом побочных сырых данных с другой системой, которая может иметь различную направленность. –