Чтение Big Endian из памяти и увеличение памяти - PullRequest
0 голосов
/ 30 октября 2011

Я не знаю, где именно проблема, но кажется, что когда я передаю «Память» по ссылке, это не работает. я пытаюсь прочитать слово из памяти в формате Big Endian и увеличить данные на 2

вот как я это делаю

WORD ReadBigEndianWORD(char **Data)
{
    WORD Result = (unsigned char) *Data[0];
    Result <<= 8;
    Result |= (unsigned char) *Data[1];
    *Data++
    return Result;
}

и я так называю

char *Memory = ........;
WORD MyWord = ReadBigEndianWORD(&Memory);

приведенный выше код не работает (работает, если функция Argment имеет значение «char * Data» и данные передаются как «Memory»);

и это лучший способ прочитать Big Endian из памяти?

спасибо;

Ответы [ 2 ]

2 голосов
/ 30 октября 2011

Ваш код не выполняется из-за приоритета операции оператора * и операции [].[] имеет более высокий приоритет, поэтому вам нужно изменить код на:

WORD ReadBigEndianWORD(char **Data)
{
    WORD Result = (unsigned char) (*Data)[0];
    Result <<= 8;
    Result |= (unsigned char) (*Data)[1];
    (*Data) += sizeof(WORD);
    return Result;
}

Строка с *Data[0] в итоге работает правильно, потому что вы добавляете нулевое смещение.Второй *Data[1] либо вылетит, но и даст вам неверные данные, потому что они читают неинициализированную память.*Data[1] эквивалентно \*(\*(Data + sizeof(char**))), поэтому оно указывает место, где хранится память, и движется дальше.

Лучший способ увидеть, что происходит, - это использовать свой исходный ReadBigEndianWORD и изменить код вызова на:

char *Memory[2] = { "........", ",,,,,,,,," };
short Myshort = ReadBigEndianshort(Memory);

Если вы сделаете это, вы увидите, что * Data [1] указывает на Память [1].

А затем, чтобы переместить указатель данных на следующую работу, вам нужно увеличить его на размер WORD, а не на char**, что есть ++ будет делать.

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

0 голосов
/ 30 октября 2011

Попробуйте добавить скобки вокруг Data, например так:

WORD Result = (unsigned char) (*Data)[0];
(*Data)++;

Но если вас смущают такие вещи, как указатели на указатели, лучше написать код более простым способом, например, иметьФункция считывает данные, а другая увеличивает указатель.На самом деле, обычно лучше делать разные вещи по отдельности, и лучше избегать кода **.

Также вы можете использовать следующее:

WORD ReadBigEndianWORD(unsigned char *Data)
{
    return (Data[0] << 8) | Data[1];
}
...