试图复制结构的成员字节列在c
-
20-08-2019 - |
题
我试图复制件的结构含有混合物整数,char和组chars入字节数组发送到一串行总线。到目前为止我
struct msg_on_send
{
char descriptor_msg[5];
int address;
char space;
char cmdmsg[5];
char CR;
char LF;
};
void switch_output_on()
{
int member;
struct msg_on_send SendMsg_on[sizeof member] =
{
};
unsigned char buffer [ sizeof SendMsg_on[0] ];
showbytes(buffer, serialize(buffer, SendMsg_on));
}
/***************************************************************************
* Function: ArrayBuild *
* Purpose: Uses memcopy to transfer the struct members sequentially *
* into an array of char *
* Arguments: *
* Returns: size_t i = a count of the number of bytes in the array *
***************************************************************************/
size_t ArrayBuild(unsigned char *dst, const struct msg_on_send *object)
{
size_t i = 0;
memcpy(&dst[i], &object->descriptor_msg, sizeof object->descriptor_msg);
i += sizeof object->descriptor_msg;
memcpy(&dst[i], &object->address, sizeof object->address);
i += sizeof object->address;
memcpy(&dst[i], &object->space, sizeof object->space);
i += sizeof object->space;
memcpy(&dst[i], &object->cmdmsg, sizeof object->cmdmsg);
i += sizeof object->cmdmsg;
memcpy(&dst[i], &object->CR, sizeof object->CR);
i += sizeof object->CR;
memcpy(&dst[i], &object->LF, sizeof object->LF);
i += sizeof object->LF;
return i;
}
/***********************************************************************
* Function: USARTWrite *
* Purpose: Writes the array data to the USART data register *
* Arguments: void *object = struct member *
* size_t size = size of array remaining *
* Returns: None *
***********************************************************************/
void USARTWrite(const void *object, size_t size)
{
const unsigned char *byte;
for ( byte = object; size--; ++byte )
{
printf("%02X", *byte);
}
putchar('\n');
}
因为我得到这样的代码,我不完全了解它是如何工作的。我可以看到,memcpy需要每一个元件的结构并且使它变成一串流索引的通过'我'可变的,但是我不知道如何USARTWrite功能packetises这成一串或如何载列与我结构初始.
对不起这个员额是一个比较长,但我刚刚开始的这个程云雀和试图把我的头围绕这一概念。
感谢 Dave
编辑:
哇,多好的答案很快-谢谢伙计们。
slaz:这似乎是合乎逻辑的我,我真的没有想过这一办法,因为我还没有真正得到了我的头周围的指针,但是我开始看到他们是一个重要部分C,因此我正式将有一个看看。
这一行代码将数据发送给我的串口,那么我替换阵列含有消息的内容?这似乎是我失踪一个合乎逻辑的步骤,在这里我有一个变量告诉我在我结构的启动和如何大,但没有列发送
USART_SendData(USART1, message_on_contents[array_count]);
哈珀*谢尔比:谢谢你的介绍,这使得它更加清晰,在我的脑海里。
请选择
Dave
解决方案
对不起,我没看到你的评论,直到现在。代码以下汇编了在Linux上就好,所以我希望这对你的作品。
printf()印在六角,你将获得2个字每个字节。
#include <stdio.h>
struct msg_on_send
{
char descriptor_msg[5];
int address;
char space;
char cmdmsg[5];
char CR;
char LF;
};
void USARTWrite(const void *object, size_t size)
{
const unsigned char *byte;
for ( byte = object; size--; ++byte )
{
printf("%02X", *byte);
}
putchar('\n');
}
int main (int argc, char**argv)
{
struct msg_on_send myMsg;
unsigned char* ptr= (unsigned char*)&myMsg;
USARTWrite(ptr, sizeof(myMsg));
return 0;
}
我希望这有所帮助。
~
~
其他提示
你不必实际上复制的结构成一系列的字节。你可以选择这样做:
struct msg_on_send myMessage;
// code to set myMessage to whatever values...
// get a byte pointer that points to the beginning of the struct
uint8_t *bytePtr = (uint8_t*)&myMessage;
// pass that into the write function, and it will write the amount of bytes passed in
USARTWrite(bytePtr, sizeof(myMessage));
权力的指针!:)
如果我要享有结构作为一系列的字节我通常使用的一个联盟结合的结构的一个字阵列。例如:
typedef union
{
struct
{
char descriptor_msg[5];
int address;
char space;
char cmdmsg[5];
char CR;
char LF;
};
BYTE bytes[];
} msg_on_send;
你的 struct
这只是字节数组,它包含没有指针,指出它。
部件的成员的复制是最有可能执行应对对准, (char*) &address
可能会大于 ((char*) &descriptor_msg) + 5
.
USARTWrite
发送 HEX
码的字节的结构 stdout
, 但放弃对准。编写这些代码与不同的准的战略将导致不同的输出。
附上你的结构宣言》 #pragma pack(push, n)
和 #pragma pack(pop)
以武力对准,而只是复制的结构字节到字节。
它是相当直截了当的:1.ArrayBuild指针指向一个msg_on_send结构,并为每个成员在那里,使用memcpy复制的字节到char阵列,通过了在喜欢,所以-
char byteArray[17]; // This assumes 4-byte ints
// be careful though, the length *must* be long enough, or
// Bad Things will happen
size_t msgSize; // Holds the size of the message built by ArrayBuild,
// passed to USARTWrite
struct msg_on_send myMessage;
// Code to fill up myMessage appropriately
msgSize = ArrayBuild(byteArray, &myMessage); // need the & to pass a pointer as required
USARTWrite(myMessage, msgSize);
USARTWrite只是给出一个char阵列和一个尺寸-它抓住每个char又和打印到画面作为一个六角的价值与printf().
在"魔法"是在ArrayBuild-memcpy并文本的副本字节从来源到目的地,与没有翻译。假设4个字节的整数,列建造的功能会看起来像这样:
1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
| A | B |C| D |E|F|
A = descriptor_msg (char[5])
B = address (int)
C = space (char)
D = cmdmsg (char[5])
E = CR (char)
F = LF (char)
我会假定,'真正的'应用程序,printf()call将被替换由一个叫到一串口写。
全面完整的例子。完美的作品。测试下X代码目标9-C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Person
{
char name[20];
int age;
};
int main()
{
//structure variable declaratio with initialisation
struct Person person={"Deniss Ritchie", 60};
//declare character buffer (byte array)
unsigned char *buffer=(char*)malloc(sizeof(person));
int i;
//copying....
memcpy(buffer,(const unsigned char*)&person,sizeof(person));
//printing..
printf("Copied byte array is:\n");
for(i=0;i<sizeof(person);i++)
printf("%02X ",buffer[i]);
printf("\n");
//freeing memory..
free(buffer);
return 0;
}
输出:
Copied byte array is:
44 65 6E 69 73 73 20 52 69 74 63 68 69 65 00 00 00 00 00 00 3C 00 00 00