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'

作者:雪涵~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值