【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:

简介: 【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:

问题:


假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:

unsigned char[16] = {0x3f, 0xa0, 0x00, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x9c};

其中:

0~3:4个字节为float f1,大端表示,IEEE754格式

4~7:4个字节为float f2,大端表示,IEEE754格式

8~11:4个字节为int i3,大端表示

12~15:4个字节为int i4,大端表示


要求:


  • (1)编写一个C语言代码,求出f1、f2、i3、i4的值;
  • (2)贴出源代码,以及打印结果。
#include <stdio.h>
void swap(unsigned char data[4]) {
unsigned char t = data[0];
data[0] = data[3];
data[3] = t;
t = data[1];
data[1] = data[2];
data[2] = t;
}
int main() {
union {
unsigned char bytes[16];
struct {
union {
float f1;
unsigned char f1_data[4];
};
union {
float f2;
unsigned char f2_data[4];
};
union {
int i3;
unsigned char i3_data[4];
};
union {
int i4;
unsigned char i4_data[4];
};
};
} data = {
.bytes = { 0x3f, 0xa0, 0x00, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x9c }
};
swap(data.f1_data);
swap(data.f2_data);
swap(data.i3_data);
swap(data.i4_data);
printf("%f %f %d %d\n", data.f1, data.f2, data.i3, data.i4);
return 0;
}


如果想检查类型,那就

void swap(_)
unsigned char _[4];
{
  unsigned char t = _[0];
  _[0] = _[3];
  _[3] = t;
  t = _[1];
  _[1] = _[2];
  _[2] = t;
}
int main() {
  union {
    unsigned char bytes[16];
    struct {
      float f1;
      float f2;
      int i3;
      int i4;
    };
  } data = {
    .bytes = { 0x3f, 0xa0, 0x00, 0x00, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x9c }
  };
  swap(&data.f1);
  swap(&data.f2);
  swap(&data.i3);
  swap(&data.i4);
  printf("%f %f %d %d\n", data.f1, data.f2, data.i3, data.i4);
  return 0;
}


思路历程:


首先想到的是利用指针从第三字节读到第零字节,存储到float类型变量中,然后打印。逐下同理。由于存储数据的类型是char[] 最小单位是1字节,利用地址(也就是指针)对字节进行操作(对字节进行操作是正确的),随之,确定了操作的基本单位—————字节

那么,指针的数据类型就确定了 unsigned char*;

随后,就没有随后了 代码打不出来 问了下qq群中的大佬,给了以上代码

简单分析一下上面的代码

4ac19c36192b91a2b6c61b0b03650cfd_f44513bb1d6ef9fdb701bd90746e054c.png

联合体和结构体套用, 读取float 就自动读取4字节数据,接下来就是对字节的交换操作了,由于是大端存储(字节逆序:将最低有效字节放在大地址单元中),数据逆置。

swap(unsigned char data[4]),简单容易理解,就不过多叙述了。

逆序后

269144160d14035f317aa29b1f17bf40_b99f3289c80bad3a892a0dd63cdd72a5.png

OK了!


细节


55c3f029e8efe011f2afe99592b16714_f96f125e5ff90c7b0d77750373747b6e.png

a6bde3c97400615b7f8cd68c158034d2_7a825ffa8b35bba8edda6bc0f0b6a0ec.png

d3993f375fc7ea5832df08feb056f5d8_72f24101f3d2b22ad1050e55eee3909c.png

a354fc65edbf85321630c98652d90a96_fe3061bf6b54854778c4cc5976d899a9.png

2c8c8e39f40c6970adfaa03f28784376_36cd9940250f9b86d3a798b178baffaa.png

6cb3bef8a3b91e8bf790f70ea6f5defe_b44cedaab3de3317a3bb167e8ed9cdbc.png

d35e0c113d0b9a9f3d82ce1b0dde9f2e_0a4a455abbb3a804fa5947039bd8f0e9.png

0389e70c541e48592fc6d4d8af8e75f2_886fe017fc947a110a45b1f55012e834.png

3a9536c96acd61df3255120242ee701d_1fdb69ca8b22488a8c0ac6629ccede75.png

1843018a0e2d5810750c921773815246_d1d68f466905470236c195b24554e3ed.png

ps:对话来自qq群一个好友回答 只是个人见解 如有错误可请谅解


相关文章
|
8月前
|
存储
【计算机组成原理】计算机的性能指标、数据的表示和运算、BCD码和余3码
计算机组成原理(二) 计算机的性能指标: 存储器的性能指标:
120 0
|
10月前
|
程序员 知识图谱
电影《孤注一掷》感触、计算机底层二进制与十进制的转换
看完《孤注一掷》后,我内心激荡起一股深刻的情感。今天,我希望与大家分享这部电影的观后感,同时还想简要介绍一下电影中涉及的秘密线索666关于二进制和十进制转换的原理。另外,也推荐一本我认为写得较为出色的计算机书籍——《计算机底层的秘密》。这段经历充满启示,引导我们一同深入探索其中蕴含的智慧。
798 0
电影《孤注一掷》感触、计算机底层二进制与十进制的转换
|
1月前
|
存储 编解码 算法
计算机编码
计算机编码
|
1月前
|
存储 算法 量子技术
计算机为什么采用二进制
计算机为什么采用二进制
41 0
|
1月前
|
存储
计算机中数据的存储及二,八,十六进制的介绍
本文将向大家介绍各种进制其中包括:二级制,八进制,十六进制;数据在内存中将如何存储。
69 0
|
10月前
|
存储 Java
在计算机中存储整数
在计算机中存储整数
114 0
|
存储 编译器 C语言
计算机大端与小端的详细解析,含判断机器大小端代码
计算机大端与小端的详细解析,含判断机器大小端代码
232 0
|
存储
为什么计算机中的每个字符都是以二进制形式存储的?底层原理是什么?
为什么计算机中的每个字符都是以二进制形式存储的?底层原理是什么?
110 0
计算机数值转换
计算机中常用的二进制、十进制、十六进制,要会互相转换,这是我们学网络最最基础的,所以一定要会哦。
计算机数值转换
|
机器学习/深度学习 前端开发 JavaScript
计算机各种进制之间的转换,外行人也能看的懂
计算机各种进制之间的转换,外行人也能看的懂
计算机各种进制之间的转换,外行人也能看的懂