Intel格式与Motorola格式

本文介绍了Intel(小端)和Motorola(大端)两种字节序的编码规则,特别是在处理多字节信号时的区别。对于超过一个字节的数据,Intel格式将高位存储在高字节,而Motorola则相反,将高位存储在低字节。此外,文章提供了一个C语言程序来检测计算机的字节序。

当一个信号的数据长度不超过 1 个字节时,Intel 与 Motorola 两种格式的编码结果没有什么不同,完全一样。

当一个信号的数据长度超过 1 个字节时,举个栗子,VIUL_MaintenanceMile信号起始40位,长度15位。

在此之前先普及一个ID地址的常识:地址值越大表示地址越高。在计算机系统中,内存地址是按照线性地址空间排列的,从地址0开始逐渐增大。因此,较大的地址值表示在内存中更高的位置。

一、Intel(小端)

占用位置:从低字节开始,高字节结束。字节内从高位开始。从占用40-47和33-39位。

信号排序:数值0x7531,二进制为 0b 0111(7) 0101(5) 0011(3) 0001(1)。

在intel当中存成0x62EA,二进制为0b 0110(3) 0010(1) 1110(7) 1010(5)。

从先分配信号数值的高字节,先分配到高字节空间,字节内空间先分配高位。这样就导致了高位在高字节,低位在低字节。

第一个数字7,分配到高字节高位。

第二个数字5,分配到高字节低位。

第三个数字3,分配到低字节高位,但是不足4位,先分配下一个数字的位置。

第四个数字1,分配到低字节低位,由于最后1位不属于该信号,向前占1位。于是第三个数字3向高位移动1位,长度只能占3位。

分配方向如下图所示:

二、Motorola(大端)

占用位置:从低字节开始,高字节结束。字节内从低位开始。占用38-39位。

信号排序:数值0x7531,    二进制为 0b 0111(7) 0101(5) 0011(3) 0001(1)。

在Motorola当中存成0x7531,二进制为0b 0111(7) 0101(5) 0011(3) 0001(1)。

从先分配信号数值的高字节,先分配到低字节空间,字节内空间先分配高位。这样就导致了高位在低字节,低位在高字节。

第一个数字7,分配到低字节高位。

第二个数字5,分配到低字节低位。

第三个数字3,分配到高字节高位。

第四个数字1,分配到高字节低位。

分配方向如下图所示

三、检测程序

以下是用C语言编写的一个检验计算机字节序的程序:

#include <stdio.h>

int is_little_endian() {
    int num = 0x01020304;
    // 将整数转换为字节序列
    unsigned char* byte_array = (unsigned char*)&num;
	printf("byte_array[0]地址:%d\n",(int)&byte_array[0]);
	printf("byte_array[1]地址:%d\n",(int)&byte_array[1]);
	printf("byte_array[2]地址:%d\n",(int)&byte_array[2]);
	printf("byte_array[3]地址:%d\n",(int)&byte_array[3]);
    // 检查字节序列中的第一个字节
    if (byte_array[0] == 0x04) {
        return 1;  // 小端序
    } else {
        return 0;  // 大端序
    }
}

int main() {
    if (is_little_endian()) {
        printf("计算机是小端序\n");
    } else {
        printf("计算机是大端序\n");
    }
    
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值