当一个信号的数据长度不超过 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*)#
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;
}