1. 程式人生 > >C語言和python將資料轉化成二進位制

C語言和python將資料轉化成二進位制

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'

作者:雪涵~