扫盲运动—字节序

1 大端、小端字节序

术语“大端”和“小端”表示多个字节值的哪一端(小端或大端)存储在该值的起始地址。

  • 大端:将高序字节存储在起始地址,这称为大端(big-endian)字节序
  • 小端:将低序字节存储在起始地址,这称为小端(little-endian)字节序

为什么要有大端、小端字节序,多麻烦!统一使用大端字节序,不是更方便吗?
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

在这里插入图片描述
来个实例,要不然实在记不住。
在这里插入图片描述

操作系统的字节序一般是和处理器架构有关系的,具体来说:

  • 小端序: x86、MOS Technology 6502、Z80、VAX、PDP-11等处理器;
  • 大端序: Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除V9外)等处理器;
  • 另外 ARM、PowerPC(除PowerPC 970外)、DEC Alpha、SPARC V9、MIPS、PA-RISC及IA64的字节序是可配置的。

2 网络字节序、主机字节序

  • 主机字节序:不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。我们把某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序。
    正是由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序。

  • 网络字节序:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用大端(big endian)排序方式。

3 网络字节序与主机字节序之间转换

3.1 C/C++

头文件<netinet/in.h>
转换函数:htons(), ntohs(), htons()htonl()htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。在使用little endian的系统中,这些函数会把字节序进行转换;
在使用big endian类型的系统中,这些函数会定义成空宏;

3.2 Java

首先声明,Java虚拟机(JVM)的规范并没有明确要求使用大端序或小端序来表示多字节数据类型。

然而,Java的DataInput和DataOutput接口确实规定了使用大端序(网络字节序)。具体原因我认为有如下几点:

  1. 一致性和跨平台兼容性
    Java的设计原则之一是“一次编写,到处运行”。为了确保这一点,Java选择了一个确定的字节序,即大端序,使得Java程序的数据读取和写入在所有平台上都具有一致性。

  2. 网络字节序
    在网络传输中,大端序通常被认为是网络字节序。因为Java最初是为网络应用设计的(想想Java的口号:“The network is the computer.”),所以选择网络字节序作为默认的字节序是合理的。

  3. 与大多数网络协议的兼容性
    许多早期的网络协议(例如IP、TCP、UDP)都使用大端序。由于Java希望与这些协议兼容,因此采用大端序作为默认设置也是有道理的。

  4. 直观性
    对于人类来说,大端序的表示方式更为直观。例如,数字 0x12345678 在大端序中的表示方式是 12 34 56 78,这与我们的阅读习惯相符。 作者:程序员_可乐 https://www.bilibili.com/read/cv25882429/ 出处:bilibili
    Java设置大小端

public class HelloEndian {public static void main(String[] args) {ByteBuffer b = ByteBuffer.wrap(new byte[4]);b.order(ByteOrder.BIG_ENDIAN);b.putInt(0x01020304);System.out.println("Big-Endian:    " + Arrays.toString(b.array()));b = ByteBuffer.wrap(new byte[4]);b.order(ByteOrder.LITTLE_ENDIAN);b.putInt(0x01020304);System.out.println("Little-Endian: " + Arrays.toString(b.array()));}}

在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。
如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。

转载链接

Java 的字节序讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GC6609,GC6610超静音的两相步进电机驱动芯片的性能分析

两相步进电机驱动芯片GC6609&#xff0c;GC6610它们是一款超静音的两相步进电机驱动芯片&#xff0c;内置最大 256 细分的步进驱动模式&#xff0c; 超静音&#xff0c;低振动。芯片可以工作在 4~36V 的宽工作电压范围内&#xff0c;平均工作电流可以达到 2A和2.5A &#xff0c…

RHEL防火墙配置

目录 1.了解firewalld 2.firewalld的基本配置 3.配置firewalld的规则 4.icmp-blocks 5.Services 6.ports 1.了解firewalld 在RHEL8中用的防火墙是firewalld&#xff0c;在 firewalld中又涉及zone的概念。首先来了解一下什么是zone 如在进地铁或高铁时需要安检&#xf…

JavaEE07 定时器的使用和模拟实现

前言 前面我们聊了很多关于阻塞队列,单例模式等的应用,今天我们就来聊聊定时器的功能和模拟实现,其实定时器的实现在我们的日常生活中也很常见,比如说平常创建一些定时任务,定时开关机,定时去发表一篇qq空间等等,今天我们就来简单实现一个定时器. 1.JVM提供的定时器的使用 在自…

现代雷达车载应用——第2章 汽车雷达系统原理 2.3节

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.3 信号模型 雷达的发射机通常发出精心设计和定义明确的信号。然而&#xff0c;接收到的返回信号是多个分量的叠加&#xff0c;包括目标的反射、杂波…

数字化转型对企业有什么好处?

引言 数字化转型已经成为当今商业领域中的一股强大力量&#xff0c;它不仅仅是简单的技术更新&#xff0c;更是企业发展的重要战略转变。随着科技的迅猛发展和全球化竞争的加剧&#xff0c;企业们正在积极探索如何将数字化的力量融入到他们的运营和战略中。 数字化转型不仅是传…

9:00面试,9:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

抖音发布最新公告,清退所有全国本地生活服务商.

11月27日&#xff0c;抖音发布最新公告&#xff0c;一文公告让本地生活服务商行业鬼哭狼嚎&#xff0c;公告很明确&#xff0c;只保留了区域服务商&#xff0c;全国性的所有服务商被清退。 我们再来看看抖音本地生活的前世今生&#xff0c;最开始的时候抖音本地生活全部是自己部…

QT用户管理效果预览

用户管理效果 QT 用户管理 GITHUB网站 QT版本 CMakeList.txt find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED) target_link_libraries(tableView PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)GitHub代码获取链接 GitHub代码获取链接

Java stream流toMap使用过程中空指针问题

Java8中stream操作list时常见的一个错误&#xff1a; 排查原因&#xff1a; 定位到代码中发现从数据查询是存在数据的 排查stream前对象为null的情况&#xff0c;那问题只能出现在toMap这里了 我们需要知道toMap是怎么帮我们封装数据的&#xff0c;先搞明白toMap的原理&#…

用在半导体CST材料搬运AGV小车的RFID

RFID&#xff08;RadioFrequencyIdentification&#xff09;&#xff0c;又称无线射频识别技术&#xff0c;可通过射频信号进行非接触式的识别目标&#xff0c;近些年来被广泛应用在半导体制造业中&#xff0c;用于半导体行业的晶圆存储柜、电子货架、硅晶片清洗、半导体天车等…

STM32——超声波传感器

需求&#xff1a; 使用超声波测距&#xff0c;当手离传感器距离小于 5cm 时&#xff0c; LED1 点亮&#xff0c;否则保持不亮状态 接线&#xff1a; 定时器配置&#xff1a; 使用 TIM2 &#xff0c;只用作计数功能&#xff0c;不用作定时。 将 PSC 配置为 71 &#xff0c;…

基于K-means与CNN的遥感影像分类方法

基于K-means与CNN的遥感影像分类 一、引言 1.研究背景 航天遥感技术是一种通过卫星对地观测获取遥感图像信息数据的技术&#xff0c;这些图像数据在各领域都发挥着不可或缺的作用。遥感图像分类主要是根据地面物体电磁波辐射在遥感图像上的特征&#xff0c;判断识别地面物体的属…

推荐算法:HNSW【推荐出与用户搜索的类似的/用户感兴趣的商品】

HNSW算法概述 HNSW&#xff08;Hierarchical Navigable Small Word&#xff09;算法算是目前推荐领域里面常用的ANN&#xff08;Approximate Nearest Neighbor&#xff09;算法了。其目的就是在极大量的候选集当中如何快速地找到一个query最近邻的k个元素。 要找到一个query的…

【1.计算机组成与体系结构】浮点数的表示

目录 1.浮点数的表示2.运算过程3.特点 1.浮点数的表示 N尾数*基数(指数/也称为阶码) 例如&#xff1a;1.25x105 ; 1.255x103 2.运算过程 对阶>尾数计算>结果格式化 3.特点 1、一般尾数用补码&#xff0c;阶码用移码 2、阶码的位数决定数的表示范围&#xff0c;位数越…

Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

什么是循环依赖,如何解决

目录 什么是循环依赖&#xff1f; 循环依赖的原因&#xff1a; 如何解决循环依赖问题&#xff1f; 最佳实践和注意事项&#xff1a; 结论&#xff1a; 当在使用 Spring Boot 进行开发时&#xff0c;循环依赖&#xff08;Circular Dependency&#xff09;可能会成为一个常见…

广东省工业和信息化厅工业互联网处一行莅临科东软件考察调研

近日&#xff0c;广东省工业和信息化厅工业互联网处副处长郑华、广东省科学院智能制造研究所副所长曹永军等一行领导、专家莅临科东软件&#xff0c;就聚焦工业数字化转型&#xff0c;助推新型工业化高质量发展进行考察调研。 科东软件陪同郑华副处长一行参观科东软件展厅&…

学习笔记——GDB调试器

感谢B站up主 xiaobing1016 的学习视频&#xff1a;基于VSCode和CMake实现C/C开发 | Linux篇_哔哩哔哩_bilibili

Redis缓存异常问题,常用解决方案总结

前言 Redis缓存异常问题分别是&#xff1a;1.缓存雪崩。2.缓存预热。3.缓存穿透。4.缓存降级。5.缓存击穿&#xff0c;以 及对应Redis缓存异常问题解决方案。 1.缓存雪崩 1.1、什么是缓存雪崩 如果缓存集中在一段时间内失效&#xff0c;发生大量的缓存穿透&#xff0c;所有…

Appium 自动化测试 —— Appium的环境搭建与设置流程!

1、Appium 环境搭建&#xff1a; 学习 appium 最大的难处之一在于环境的安装&#xff0c;安装流程比较繁琐&#xff0c;安装的工具和步骤也较多&#xff0c;以下是基于 Windows 系统下的 Android 手机端的安装流程。就像我们在用 Selenium 进行 web 自动化测试的时候一样&…