Перевод целого в байты и обратно

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 3 сен 2020.

  1. проблема с перегоном чисел в байты и в целое.
    где то что то не срастается...
    в целое из некстона:
    Код (C++):

    Код (C++):
    Serial.print("это пришло из некстона ");
           int w = int((unsigned char)(DataSl[3]) << 24 |
               (unsigned char)(DataSl[2]) << 16 |
               (unsigned char)(DataSl[1]) << 8 |
               (unsigned char)(DataSl[0]));
    в байты из целого
    Код (C++):
    Код (C++):
    int x =0;
        Serial.println(x); // пришло целое
        packetBuffer[0] = x & 0xff;
        packetBuffer[1] = (x>>8) & 0xff;
        packetBuffer[2] = (x>>16) & 0xff;
        packetBuffer[3] = (x>>24) & 0xff;
    ;
    помогите, кто чем может...
     
  2. parovoZZ

    parovoZZ Гуру

    А зачем это делать?
     
  3. b707

    b707 Гуру

    Михаил, уже ответил в другой теме - нижний код. если описать x как uint32_t - должен работать.

    Верхний код - хуже,
    как на мой взгляд. строчка
    Код (C++):
    (unsigned char)(DataSl[2]) << 16
    попахивает бредом
    В переменной типа char бессмысленно выполнять сдвиг влево на 16 бит - просто некуда :)
     
  4. akl

    akl Гуру

    можно типа создать переменную-клон этого массива с тем же адресом что у массива и из нее уже переложить в нормальную переменную. Тут на форуме подсмотрел у кого-то. вроде работает.
     
  5. parovoZZ

    parovoZZ Гуру

    Не проще через указатель?
     
    Igor68 нравится это.
  6. Asper Daffy

    Asper Daffy Иксперд

    Используй union, оно само по байтам растащится, и не трахай нам мозг.
     
  7. ИгорьК

    ИгорьК Оракул Модератор

    А я то все думал, для чего union предназначен. Вон оно что - для сохранения мозга старослужащим.

    Ну, посмотрим, поможет заведомо этот совет ТС или... или Гайвер дерьмовый код пишет. Кстати, при чем здесь Гайвер.
     
  8. Asper Daffy

    Asper Daffy Иксперд

    Это-то да.
    Вот и я не понял, зачем ты его упомянул в теме, где раньше он не упоминался. Колись.
     
    b707 нравится это.
  9. перевод чисел работает, только, почему то, до 32000.
    а дальше - дикие значния.
     
  10. Код (C++):
    uint32_t x = 5444;
       packetBuffer[0] = x & 0xFF;
        packetBuffer[1] = (x >> 8) & 0xFF;
        packetBuffer[2] = (x >> 16) & 0xFF;
        packetBuffer[3] = (x >> 24) & 0xFF;

    uint32_t w = uint32_t((unsigned char)(DataSl[3]) << 24 |
                (unsigned char)(DataSl[2]) << 16 |
                (unsigned char)(DataSl[1]) << 8 |
                (unsigned char)(DataSl[0]));

     
     
  11. parovoZZ

    parovoZZ Гуру

    @Михаил123
    Открой виндовый калькулятор и поупражняйся там. Там всё наглядно.
     
    Andrey12 нравится это.
  12. SergeiL

    SergeiL Оракул Модератор

    Ну не до 32000, а до 32767 ;)
     
  13. b707

    b707 Гуру

    так я вам многократно уже написал, что в типе int только два байта и помещаются числа от -32766 до 32767
    Вы не слышите.
    Ну и упражняйтесь дальше...
     
    KindMan нравится это.
  14. b707

    b707 Гуру

    опять бред
    Михаил, почему вы упорно не желаете ничему учиться? сколько вы уже сношаете мозг на разных форумах? месяца три? - за это время учебник С++ можно было наизусть выучить...
    вы же предпочитаете с каждой строчкой трахаться по неделе... Не понимаю.
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Потому что есть ограничение на размер целого числа.

    Тебе же сказали используй union, там вообще НИЧЕГО не надо переводить от слова совсем. Ты вообще, читаешь, что тебе пишут?
     
  16. parovoZZ

    parovoZZ Гуру

    он хочет поупражняться в битовых операциях.
     
  17. b707

    b707 Гуру

    скорее просто где-то списал... но неудачно. Либо автор был такой же балбес
     
  18. Asper Daffy

    Asper Daffy Иксперд

    Хотел бы - упражнялся бы. А он хочет нам всем мозг затрахать - это единственное, что у него получается.
     
  19. akl

    akl Гуру

    я вот такие функции соорудил основываясь на опыте старших товарищей
    вроде работает как надо.
    Код (C++):

    void longtoarr(uint32_t nom, uint8_t* arr){
        union un{uint32_t n; uint8_t arr_[4];}u;
        u.n=nom;
        for(int i=0; i<4; i++){arr[i]=u.arr_[i];}
    }
    uint32_t arrtolong(uint8_t* arr){
        uint8_t arr_[4];
        uint32_t &n = (uint32_t&)arr_;
        return n;
    }
     
    Но если в arrtolong мне все нравится ибо очень круто и молодежно, то в longtoarr определенно режет глаз этот тупой цикл с копированием массива. Можно ли здесь вывернуть что-то столь же дерзкое как в arrtolong с моднейшими адресами, приведениями типов и прочими голограммами?


    а нет arrtolong ващше не должно работать в таком виде. не понимаю почему оно работает
    а нет понимаю короче вторая функция не нужна походу
    Нет я определенно какой-то бред сделал, но почему-то оно работает
     
    Последнее редактирование: 4 сен 2020
    Un_ka нравится это.
  20. b707

    b707 Гуру

    Код (C++):
    void longtoarr(uint32_t* nom, uint8_t* arr){
       memcpy((uint8_t*)nom,arr,4);
    }
    А реально вообще никакая функция не нужна. можно обойтись одной memcpy. причем работает в обе стороны
     
    akl нравится это.