1.問題的起源
各位小夥伴們有沒有遇到過,單片機向單片機間、單片機和電腦間利用序列槽或其他什麼的傳輸資料的問題嘞?不知道你們是怎麼解決的,反正我常用的方法是将資料先轉化成字元串,天下的字元串都長得一樣,然後傳輸過去,在另一端将字元串分割并還原為資料。
我一直感覺這種方法蠻浪費資源的,明明本來就是數字的東西,還要折騰兩遍。比如0xFFFFFFFF這個一個四位元組的整型資料,轉化成字元串為十位元組的“4294967295”,簡直事倍功半。然後嘞偶然了解到聯合體這麼個東東。。。。。。
2.C語言滴聯合體(union)
譚浩強寫的C語言程式設計(第二版)中大概有半頁講這個吧,反正看過就忘了。話不多,咱們少動腦子多敲代碼。
#include "stdio.h"
struct up_data //定義了一個結構體,裡邊就是需要上傳的資料格式,一共12位元組。
{
int x;
int y;
};
union ss //定義一個聯合體,說白了就是裡邊的東西都用一塊空間
{
struct up_data a;
char b[sizeof(up_data)]; //這裡有點點小問題,但是能用,不寫值好像也行。
}sa; //這裡直接執行個體化了一個聯合體
int main()
{
sa.a.x = 49; //如果改成0xffffffff的話,下面輸出的sa.b長度就是8了。
sa.a.y = 825373234; //0x31323232
sa.a.z = 3.1415;
printf_s("%d\r\n",strlen(sa.b));
printf_s("%d\r\n", sizeof(up_data));
printf_s("%x %x %x %x\r\n", sa.b[0], sa.b[1], sa.b[2], sa.b[3]);
printf_s("%x %x %x %x\r\n", sa.b[4], sa.b[5], sa.b[6], sa.b[7]);
//結果自己體會吧。我也不知道下面為啥這樣的排版。
/* 1
8
31 0 0 0
32 32 32 31*/
}
這樣就可以快樂的用序列槽發送sa.b這個“字元串”了。
3.還記得可愛可恨的指針嗎
那年學過的指針也能解決這個問題哎。
#include "stdio.h"
struct up_data
{
int x;
int y;
};
int main()
{
struct up_data a1;
unsigned char *p;
a1.x = 825373234; //0x31323232
a1.y = 825373233; //0x31323231
p = (unsigned char *)&a1; //就是這樣。。。
printf_s("%x %x %x %x\r\n",p[0],p[1],p[2],p[3]);
printf_s("%x %x %x %x\r\n", p[4], p[5], p[6], p[7]);
/*32 32 32 31
31 32 32 31*/
}
4.python中怎麼搞嘞
from ctypes import *
from io import BytesIO
class lll(Structure):
_fields_ = [
("a1", c_int),
("a2", c_int), ]
ax = lll(825373234,50);
f=BytesIO()
f.write(a1)
a=f.getvalue()
print(a[0:8])
#b'22214\x00\x00\x00'
作者:雪涵~