LINUX.ORG.RU

История изменений

Исправление vsrmis, (текущая версия) :

Погуглю, спасибо.Только почему вся информация по этому поводу меня уводит в C#? Я на нём толком не писал и никогда не искал, от куда такой наплыв? Ну это оффтопик. Тем временем я продолжаю эксперимент и снова я чего-то недопонимаю.

#include <iostream>
#pragma pack(push, 1)
struct P
{
  
  unsigned size:16;
  unsigned char data;
  unsigned control:16;
};
#pragma pack(pop)

int main()
{
 
  char buf []= {0x05,0x00,'H','e','l','l','o',0x02,0x01};
  P* a = (P*)buf;
  a->control = *(char *) (buf+2+a->size);
  std::cout<<a->size<<std::endl;
  std::cout<<a->control<<std::endl;
}
------------------------
[alex@archalex MODBUS]$ g++ first.cpp
[alex@archalex MODBUS]$ ./a.out 
5
2

И так. я записал в данных, число 5 по системе litle-edian в 16 битовом числе, после этого 5 байт , посде этого число 258 по системе литл эдиан. Я присвоил указатель, а потом присвоил значению control этот-же указатель, только со смещением на 2( 2 первые 2 байта - size) + размер данных, хранящийся в size. control 16 битный. Я ожидаю, что в control попадёт 258, но оно в него не попадает.В него попадает 2, а это значит, что второй байт игнорируется и вместо него там нули.

Исходная версия vsrmis, :

Погуглю, спасибо.Только почему вся информация по этому поводу меня уводит с C#? Я на нём толком не писал и никогда не искал, от куда такой наплыв? Ну это оффтопик. Тем временем я продолжаю эксперимент и снова я чего-то недопонимаю.

#include <iostream>
#pragma pack(push, 1)
struct P
{
  
  unsigned size:16;
  unsigned char data;
  unsigned control:16;
};
#pragma pack(pop)

int main()
{
 
  char buf []= {0x05,0x00,'H','e','l','l','o',0x02,0x01};
  P* a = (P*)buf;
  a->control = *(char *) (buf+2+a->size);
  std::cout<<a->size<<std::endl;
  std::cout<<a->control<<std::endl;
}
------------------------
[alex@archalex MODBUS]$ g++ first.cpp
[alex@archalex MODBUS]$ ./a.out 
5
2

И так. я записал в данных, число 5 по системе litle-edian в 16 битовом числе, после этого 5 байт , посде этого число 258 по системе литл эдиан. Я присвоил указатель, а потом присвоил значению control этот-же указатель, только со смещением на 2( 2 первые 2 байта - size) + размер данных, хранящийся в size. control 16 битный. Я ожидаю, что в control попадёт 258, но оно в него не попадает.В него попадает 2, а это значит, что второй байт игнорируется и вместо него там нули.