powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Получить последовательность байтов из структуры
3 сообщений из 3, страница 1 из 1
Получить последовательность байтов из структуры
    #35287878
DanilSoldatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет программистам!

Не мог бы мне кто-нить пояснить такую ситуацию (пишу на Си).
Мне нужно получить последовательность байтов из union SENDPRICE в массиве char page[50].

Объявление следующее:

struct TLVHADPrefix
{
char Protocol[3];
char Version;
};

struct TLVHAD
{
struct TLVHADPrefix Prefix;
char WSCode[8];
WORD OperCode;
DWORD Len;
};

union SENDPRICE
{
char page[50];

struct
{
struct TLVHAD Header;
WORD Tag;
WORD Len;
char DATE[12];
} var;
};

Затем в теле функции я присваиваю значения членам структуры - члена union SENDPRICE:

union SENDPRICE vTLV302; // Объявление

memcpy( vTLV302.var.Header.Prefix.Protocol, "TLV", 3 );

vTLV302.var.Header.Prefix.Version = '1';

memcpy( vTLV302.var.Header.WSCode, "00000022", 8 );

vTLV302.var.Header.OperCode = 302;
vTLV302.var.Header.Len = 13;

vTLV302.var.Tag = 1;
vTLV302.var.Len = 23;
memcpy( vTLV302.var.DATE, "444444444447", 12 );

и смотрю, что появилось в page[50], ожидая там увидеть всю эту последовательность из 3 + 1 + 8 + 2 + 4 + 12 + 2 + 2 = 34 байтов (при чем в таком же порядке как в структуре ).

Но реально там: TLV100000022. - вообщем всего 14 байтов


Если же я ставлю в объявлении элемент DATE[12]; на первое место вот так (это я делал для эксперимента, хотя для моей задачи это не подходит):

union SENDPRICE
{
char page[50];

struct
{
char DATE[12];
struct TLVHAD Header;
WORD Tag;
WORD Len;

} var;
};

то получаю 444444444447TLV100000022. - 26 байтов

Как же все таки получить нужную последовательность, объясните мне дураку?
...
Рейтинг: 0 / 0
Получить последовательность байтов из структуры
    #35288221
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanilSoldatovНо реально там: TLV100000022. - вообщем всего 14 байтовреально там как раз 50 байтов, смотри на объявление char page[50]; ты просто не всё выводишь.
...
Рейтинг: 0 / 0
Получить последовательность байтов из структуры
    #35289105
DanilSoldatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДА, все оказывается правильно было

просто я в отладчике смотрел,
а тот показывал page как строку а не как последовательность байтов

и обрывал ее на нулевом байте

Поэтому я посмотрел
page[0], page[1] и т.д. и все ок.


А про выравнивание кто-нить что-нить слышал? Что-то все предложенные способы вроде испробовал - все равно лишние два байта появляются.

Вот такая последовательность получается из вішеуказанного union SENDPRICE:

84
76
86
17
-------------TLV17
28
0
0
0
--------------DWORD len =28
48
48
48
48
48
48
57
57
----------------WSCode[8] = 00000099
46
1
---------------WORD OperCode=302
0
0
-----------------лишние байты
1
0
-----------------WORD Tag = 1
14
0
------------------WORD len = 14
48
53
49
48
48
55
48
48
48
48
48
48
-----------------DATE[12]= 051007000000


Делал так - не помогает:

#pragma pack(push, _Struct, 1)
struct TLVHAD
{
TLVHADPrefix Prefix;
DWORD Len;
TermID WSCode;
WORD OperCode;
};
#pragma pack(pop, _Struct)


union SENDPRICE
{
char page[35];

#pragma pack(push, _Struct, 1)
struct
{
struct TLVHAD Header;
WORD Tag;
WORD Len;
MaxDATE DATE;
} var; // 34
#pragma pack(pop, _Struct)
};
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Получить последовательность байтов из структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]