PRJ - Write Int Union#

2024-05-29

/*
* 将int, float类型编码为字节,便于存储
* 
* 在8位MCU中,能处理的基本数据单位为 Byte (8bit),这是历史遗留问题。同时 EEPROM 的读写、Serial, I2C 的收发也都以字节为单位。
* 
* 将长于1字节的 int, long, float 等类型的数据在存取时,也势必按字节依次进行。
* 
* - 这里将多字节的 data 分解为多个独立的字节 这一转换过程称为 编码;
* - 将与之相反的多个独立字节合并为原始的 data 的过程称为 解码。
* 
* 这一对转换操作,非常适合用 C 语言的 union 实现,几乎没有开销,也不会出错。
* 
* 
*/


void setup() {
  
  // encode Int to two byte

  // 编码结构
  typedef union {
    int intNum;
    byte binary[2];
  } binaryInt;

  // 被编码数据
  binaryInt hi;
  hi.intNum = 0x1234;
  Serial.begin(9600);
  delay(1000);


  Serial.write(hi.binary, 2);

  Serial.println("");
  Serial.println(hi.intNum, HEX);



  // decode
  binaryInt hi2;

  // 模拟读入的2个独立字节
  hi2.binary[0] = 0x56;  // 注意高低字节的顺序,例如,这里可能是错误的
  hi2.binary[1] = 0x78;

  // 可以按 int 型访问
  Serial.println(hi2.intNum, HEX);
}



void loop() {
  // put your main code here, to run repeatedly:
}