C語言和python將資料轉化成二進位制
阿新 • • 發佈:2019-01-07
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'
作者:雪涵~