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

я хочу передавать данные по битам, поэтому я имел доступ к данным с переменной 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», поэтому я думаю, что эта система имеет прямой порядок байтов.

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

проще говоря, я думаю, что я передал данные в прямую память от точки к точке, как это

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

я не знаю, почему это происходит. кто-нибудь может объяснить об этом?

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

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


person 신승빈    schedule 28.03.2020    source источник
comment
data by bit unit - но вы печатаете байты, а не биты. Похоже, вы захотите использовать std::ostream::write. Я не понимаю - объясните, что именно? why this happen - что происходит?   -  person KamilCuk    schedule 28.03.2020
comment
@KamilCuk, вы имеете в виду, что рекомендуете использовать ostream::write?   -  person 신승빈    schedule 28.03.2020
comment
Если вы отправляете данные по проводу, например. с чипом UART этот чип должен правильно упорядочивать биты на проводе для вас и правильно представлять их получателю на другом конце. Я подозреваю, что вы, возможно, слишком много думаете об этом и заимствуете проблемы. Вы столкнулись с фактической ситуацией, когда данные поступают неправильно?   -  person Mike Robinson    schedule 28.03.2020
comment
so i think this system is big endian - Вы уверены? Младший значащий байт (т.е. 65) идет первым. you mean that you recommend - Не рекомендую, я не понимаю, что вы делаете и что хотите сделать. Я полагаю, что неправильно понял ваш вопрос.   -  person KamilCuk    schedule 28.03.2020
comment
@KamilCuk да, ты прав. я был ошибкой. система с прямым порядком байтов. Благодарность!   -  person 신승빈    schedule 28.03.2020
comment
@MikeRobinson Я думаю об отправке данных в другую систему, но ситуация неверна. но в этой проблеме теперь я знаю, что было не так. спасибо за ваш совет!   -  person 신승빈    schedule 28.03.2020
comment
если вы используете обычный ПК, то 99,99% у вас система с прямым порядком байтов   -  person phuclv    schedule 28.03.2020


Ответы (1)


когда я обращаюсь к данным по байтам, первый адрес, указывающий данные, показывает «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*(), которые преобразуют различные целочисленные типы из узла в сеть или из сети в порядок байтов узла.

person Pete Kirkham    schedule 28.03.2020
comment
ах! Спасибо. я был ошибкой. система с прямым порядком байтов. теперь я знаю, что было не так. - person 신승빈; 28.03.2020