я хочу передать данные в байтовом выражении, и я думаю, что это метрическая система с порядком байтов - PullRequest
0 голосов
/ 28 марта 2020

Я хочу передавать данные по битам, чтобы я имел доступ к данным с переменной char *. вот мой код.

int main()
{
    //initiate int variable and casting with char*
    int a = 65;
    cout << a << endl;
    char* p = reinterpret_cast<char*>(&a);
    cout << "------------------" << endl;

    //check char* p is pointing &a
    cout << &a << endl;
    printf("0x%x\n", p);
    cout << "------------------" << endl;

    //access int variable with byte unit
    cout << (int)*(p + 0) << endl;
    cout << (int)*(p + 1) << endl;
    cout << (int)*(p + 2) << endl;
    cout << (int)*(p + 3) << endl;
    cout << "------------------" << endl;

    //initiate int variable and assemble with char* access in way 1
    int* b = new int(0);
    *b = *(p + 0) << 24;
    *b += *(p + 1) << 16;
    *b += *(p + 2) << 8;
    *b += *(p + 3);

    cout << *b << endl;
    cout << "------------------" << endl;

    //initiate int variable and assemble with char* access in way 2
    *b = *(p + 0);
    *b += *(p + 1) << 8;
    *b += *(p + 2) << 16;
    *b += *(p + 3) << 24;

    cout << *b << endl;

    return 0;
}

и выводим его следующим образом.

65         -> variable a is 65
------------------
0x61ff04
0x61ff04   -> char* p is pointing right
------------------
65
0
0
0          -> access with byte unit
------------------
1090519040 -> way 1
------------------
65         -> way 2

, когда я получаю доступ к данным по байтным единицам, эти данные, указывающие на первый адрес, показывают «65», так что я думаю, что эта система big endian.

, поэтому я подумал, что если я хочу передать данные 'a' в переменную 'b', тогда данные * (p + 0) должны быть go в первую очередь как способ 1, но результат не не правильно. * (p + 0) go в конце - способ 2, покажите правильное значение.

в простом смысле, я думаю, что я передавал данные в прямой памяти, чтобы указать, как это

variable a    =>    variable b
[0x000000]    =>    [0x100000]
[0x000001]    =>    [0x100001]
[0x000002]    =>    [0x100002]
    ...       =>       ...

Я не знаю, почему это произошло. Кто-нибудь может объяснить по этому поводу?

==================================== =============================================

проблема была решена. система не была порядочной. я ошибся.

1 Ответ

0 голосов
/ 28 марта 2020

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

Нет, это означает, что она имеет младший порядковый номер Младший значащий байт находится в младшем адресе и имеет значение 65.

Что касается «передачи» данных между указателями одного типа путем копирования байта простых старых данных за байтом, если вы не переходите между Системы, то порядок байтов не имеет значения. Это имеет значение только в интерпретации, а ( *(p + 0) << 24 ) | ( *(p + 1) << 16 ) | ( *(p + 2) << 8 ) | *(p + 3) - это интерпретация с прямым порядком байтов, поэтому дает неверный результат. Вы уже знаете, что *p - это 65 *p - это 65, поэтому, даже если вы забудете, какое значение означает большое или маленькое, *(p + 0) << 24 будет неправильным.

Если вы хотите передавать между системами байт- побайтно, есть функции posix hton*X*() и ntoh*X*(), которые преобразуют различные целочисленные типы от хоста к сети или от сети к хосту в порядке байтов.

...