История изменений
Исправление 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, а это значит, что второй байт игнорируется и вместо него там нули.