当前位置: 首页 > news >正文

常见面试题:字节序判别和转换

在计算机中,字节序指的是多字节数据的存储顺序。最常见的字节序有两种:大端字节序(Big-Endian)和小端字节序(Little-Endian)。
大端字节序是指最高有效位(Most Significant Bit,简称MSB)保存在内存的低地址中,而最低有效位(Least Significant Bit,简称LSB)保存在内存的高地址中。小端字节序则相反,LSB保存在内存的低地址中,而MSB保存在内存的高地址中。
在进行网络通信或跨平台数据交换时,需要确保数据的一致性,因此需要判别或转换字节序。
在C++语言中,可以通过以下方法判别或转换字节序:

判别字节序

可以使用如下代码判别当前系统的字节序:

#include <iostream>  void checkEndian() {  int num = 1;  if (*(char *)&num == 1) {  std::cout << "Little-Endian" << std::endl;  } else {  std::cout << "Big-Endian" << std::endl;  }
}void checkEndian1(){int x = 0x1234;if(*(char*)&x == 0x12){std::cout << "Big-Endian" << std::endl;  }else{std::cout << "Little-Endian" << std::endl;  }
} 

该代码将整数1的地址强制转换为字符指针,如果LSB为1,则说明当前系统是小端字节序,否则为大端字节序。

转换字节序

对于多字节数据,可以使用以下方法进行字节序转换:

#include <iostream>  
#include <cstring>  int convertEndian() {  unsigned int num = 0x12345678; // 32位整数,假设为大端字节序  unsigned char bytes[4];  memcpy(bytes, &num, sizeof(num)); // 将num的字节拷贝到bytes数组中  if (bytes[0] == 0x12 && bytes[1] == 0x34 && bytes[2] == 0x56 && bytes[3] == 0x78) {  std::cout << "Big-Endian" << std::endl;  unsigned int converted_num = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0]; // 转换为大端字节序  std::cout << "Converted: " << std::hex << converted_num << std::endl;  } else {  std::cout << "Little-Endian" << std::endl;  unsigned int converted_num = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; // 转换为小端字节序  std::cout << "Converted: " << std::hex << converted_num << std::endl;  }  return 0;  
}int convertEndian1(){unsigned int num = 0x12345678;unsigned int dst = (num&0xff) << 24|(num&0xff00) << 8|(num&0xff0000) >> 8|(num&0xff000000) >> 24;std::cout << "Origin:" << std::hex << num << " "<< "Converted:" << std::hex << dst << " "<< "htonl:" << std::hex << htonl(num) << std::endl;return 0;
}

该代码将整数0x12345678的字节拷贝到一个字符数组中,然后根据字节序的不同进行转换。对于大端字节序,最高有效字节保存在数组的第一个元素中,因此按照顺序进行转换即可;对于小端字节序,最低有效字节保存在数组的第一个元素中,需要倒序进行转换。

http://www.lryc.cn/news/120651.html

相关文章:

  • Maxwell与canal工具对比
  • SpringBoot——如何运行Python脚本并返回数据
  • 在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)
  • R语言初学者书籍推荐
  • Taro+Vue3,点击按钮把另一个页面分享出去
  • CSS基础:学习CSS样式的基本语法和应用,了解如何美化网页。
  • MySQL语句总和之表数据操作(增删改查)
  • HDFS中snapshot快照机制
  • YOLOv5基础知识入门(5)— 损失函数(IoU、GIoU、DIoU、CIoU和EIoU)
  • Centos7源码安装redis
  • [静态时序分析简明教程(九)]多周期路径set_multicycle_path
  • Unity学习笔记--使用 C# 开发一个 LRU
  • 【一】初步认识数据库
  • HTML <section> 标签
  • PHP 之房贷计算器、组合贷
  • 解决Vue+Element UI使用表单rules国际化时From表单验证信息不能实时更新
  • 友善之臂NanoPi NEO利用fbtft驱动点亮1.69寸ST7789V2屏幕
  • MFC第三十天 通过CToolBar类开发文字工具栏和工具箱、GDI+边框填充以及基本图形的绘制方法、图形绘制过程的反色线模型和实色模型
  • Android Https
  • Games101学习笔记2
  • java字符串String类的常用方法
  • 自动化测试如何解决chrome自动更新问题
  • 闲鱼卖货:新手容易踩坑的7个地方。赶紧看看有没有中招?
  • PowerShell 获取某目录下所有的文件、文件夹,同时对获取到的文件路径字符串进行替换处理
  • JUC并发编程之线程锁(一)
  • Android AlertDialog标题居中
  • k8s界面化平台dashboard、kubesphere、Rancher对比
  • 【字符串左旋】
  • Docker Dirtypipe(CVE-2022-0847)漏洞复现与分析容器逃逸
  • python接口自动化测试框架2.0,让你像Postman一样编写测试用例,支持多环境切换、多业务依赖、数据库断言等