Intel格式与Motorola格式

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

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

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

一、Intel(小端)

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

Intel格式与Motorola格式_第1张图片

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

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

Intel格式与Motorola格式_第2张图片

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

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

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

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

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

分配方向如下图所示:

Intel格式与Motorola格式_第3张图片

二、Motorola(大端)

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

Intel格式与Motorola格式_第4张图片

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

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

Intel格式与Motorola格式_第5张图片

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

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

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

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

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

分配方向如下图所示

Intel格式与Motorola格式_第6张图片

三、检测程序

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

#include 

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;
}

你可能感兴趣的:(CAN工具,数据库)