Как объединить массив шестнадцатеричных байтов с длинным целым числом без использования объединения в C?

У меня есть массив. Байты массива в шестнадцатеричном формате. Теперь я пытаюсь объединить индексы массива от 1 до 4 в unsigned long int и от 5 до 8 в еще один unsigned long int и индексы 9 и 10 в unsigned int. Я пробовал так. Но это не работает. Я не хочу использовать объединение для объединения. Я использую этот код в STM32F4-Discovery.

Это функция обработчика прерывания приема:

  void usart1_IRqHandler()
  {
  unsigned char received_string[20];
  unsigned long int Addr1=0,Addr2=0;
  unsigned int Addr=0;

  /*Code to Receive Entire packet.......
   .....................................
   .....................................
  At this point whole packet is received, now I want to send back the response to the target node using address from received data, So first step is to concatenate address bytes*/ 

  /*From the logic analyzer I can observe the received_string bytes as shown below 
  received_string[1]=0x00; 
  received_string[2]=0x13;
  received_string[3]=0xA2;
  received_string[4]=0x00;

  received_string[5]=0x40;
  received_string[6]=0xB4;
  received_string[7]=0x14;
  received_string[8]=0x35;

  received_string[9]=0x8E;
  received_string[10]=0xC7;*/

  Addr1 =  (received_string[1]<<24)| (received_string[2]<<16)| (received_string[3]  <<8)| received_string[4]);
  Addr2 =  (received_string[5]<<24)| (received_string[6]<<16)|(received_string[7]  <<8)| received_string[8]);           
  Addr =  (received_string[9]<<8)| (received_string[10]);   

  Send_packet(Addr1,Addr2,Addr);
  }

Функция Send Packet будет нацелена на удаленный узел с этим адресом.

     Send_packet(unsigned long int Addr1,unsigned long int Addr1,unsigned int Addr)
    {
      unsigned char tx_buf[20];
      tx_buf[5]=(Addr1>>24) & 0xff;
      tx_buf[6]=(Addr1>>16) & 0xff;
      tx_buf[7]=(Addr1>>8)  & 0xff;
      tx_buf[8]=(Addr1>>0)  & 0xff;

      tx_buf[9]=(Addr2>>24)  & 0xff;
      tx_buf[10]=(Addr2>>16) & 0xff;
      tx_buf[11]=(Addr3>>8)  & 0xff;
      tx_buf[12]=(Addr4>>0)  & 0xff;

      tx_buf[9]=(Addr2>>8)  & 0xff;
      tx_buf[10]=(Addr2>>0) & 0xff;

      usart_send(tx_buf);

   }

Это результат отправки пакета в логическом анализаторе.

  Addr1=0xA2401437
  Addr2=0x025500A2
  Addr=0x4014

Поскольку адрес не совпадает, я не могу настроить таргетинг на удаленный узел.


person user2819759    schedule 31.03.2015    source источник
comment
Я полагаю, что в вашем реальном коде имена переменных действительно совпадают?   -  person Some programmer dude    schedule 31.03.2015
comment
вы намеренно не указали received_string[0]?   -  person Sourav Ghosh    schedule 31.03.2015
comment
Да, имена переменных совпадают. На самом деле полученная строка [0] - это начальный разделитель, который мне не нужен, от Received_string [1] до Receive_string [4], от 5 до 8 и от 9 до 10 адреса удаленных узлов. Так что меня беспокоит только адрес.   -  person user2819759    schedule 31.03.2015
comment
Когда и где вы смотрите содержимое переменных? Как ты сделал это? (И, пожалуйста, отредактируйте вопрос, чтобы отразить фактический код, особенно в отношении имен переменных.)   -  person Some programmer dude    schedule 31.03.2015
comment
Спасибо за ваше руководство. Вот полная история.   -  person user2819759    schedule 31.03.2015
comment
Вау. Спасибо. это очень простой способ решить проблему.   -  person user2819759    schedule 01.04.2015


Ответы (1)


int i = ((received_string[0] << 24) & 0xff000000) |
                ((received_string[1] << 16) & 0x00ff0000) |
                ((received_string[2] << 8) & 0x0000ff00) |
                ((received_string[3] << 0) & 0x000000ff);

Это создаст для вас беззнаковое целое число. Вы можете изменить индексы моего примера на желаемые индексы

person Yasir Majeed    schedule 31.03.2015
comment
Привет спасибо. Но это не работает. Не могли бы вы предложить мне? Мне очень жаль, что я не включил полный код раньше. Но теперь я включил полный код. - person user2819759; 31.03.2015
comment
Вы используете «››» вместо «‹‹»? - person Yasir Majeed; 31.03.2015
comment
О боже, вы используете 0xff вместо 0xff000000, 0x00ff0000, 0x0000ff00 или 0x000000ff. Вам нужно использовать эти 4 байта в шестнадцатеричном формате вместо 1 байта в шестнадцатеричном формате 0xff. - person Yasir Majeed; 31.03.2015
comment
Ваши маски избыточны, это имеет тот же эффект, что и исходный код (за исключением того, что вы также изменили индексы массива) - person M.M; 31.03.2015
comment
Как ты можешь это говорить. Это просто операция. Не присвоение. 0xff будет & только с младшим байтом. А как насчет старших байтов?? Я реализовал его и использую в нескольких приложениях. - person Yasir Majeed; 31.03.2015
comment
Вот пример. Объявить массив символов [4] = {'1','2','3','4'}; что в основном 0x31,0x32,0x33,0x34. Когда вы запустите приведенный выше код, значение «i» будет равно 0x31323334. И я получил отрицательный голос за правильное решение - person Yasir Majeed; 31.03.2015