一、高地址和低地址
二、高字節低字節
如十六進制:0x01 00 00 04 。則04屬於低字節,01屬於高字節
三、大小端模式
(1)在內存中的存放順序為低字節存放在高地址,則為大端模式
Motorola高字節(高位)在前(低地址).
(2)在內存中的存放順序為低字節存放在低地址,則為小端模式
Intel低字節(低位)在前(低地址)
四、大小端相互轉換
通過移位操作再或
1 //16位 2 ushort A; 3 (A & 0xFF00)>>8 | (A & 0x00FF)<<8; 4 5 //32位 6 ushort A; 7 (A & 0xFF000000)>>24 | (A & 0x00FF0000)>>8 8 |(A & 0x0000FF00)<<8 | (A & 0x000000FF)<<24;
五:Intel與Motorola內存圖
信號的起始位,一般來講,主機廠在定義整車CAN總線通信矩陣時,其每一個信號都從其最低位開始填寫,這樣也符合使用習慣。所以信號的起始位就是信號的最低位。這也與CANoe中CANdb++的定義Startbit含義一致。
CAN總線上的消息單幀某個信號的值計算(C#)
1 public static ulong GetMotorolaSignalValue(byte[] data, int startBit, int bitLength) 2 { 3 ulong canSignalValue = 0; 4 for (int i = data.Length - 1, j = 0; i >= 0; i--, j++) 5 { 6 canSignalValue += (ulong)data[j] << (i * 8); 7 } 8 9 int x = startBit / 8; 10 int y = startBit % 8; 11 int z = x * 8 + 8 - y; 12 int rightMoveCount = data.Length * 8 - z; 13 14 canSignalValue >>= rightMoveCount; 15 16 return canSignalValue & ulong.MaxValue >> 64 - bitLength; 17 } 18 19 public static ulong GetIntelSignalValue(byte[] data, int startBit, int bitLength) 20 { 21 ulong canSignalValue = 0; 22 for (int i = data.Length - 1; i >= 0; i--) 23 { 24 canSignalValue += (ulong)data[i] << (i * 8); 25 } 26 27 int x = startBit / 8; 28 int y = startBit % 8; 29 30 int rightMoveCount = x * 8 + y; 31 canSignalValue >>= rightMoveCount; 32 return canSignalValue & ulong.MaxValue >> 64 - bitLength; 33 }
內存中各對象存放順序
1、原則
(1)一個整數類型內部
低地址存儲低位,高地址存儲高位。比如int a=1,則存儲情況為0000(高地址) 0000 0000 0001(低地址)
(2)若干個局部變量(在棧中存儲的)
先定義的高地址,后定義的低地址
(3)類、結構體或數組的元素
先定義的低地址,后定義的高地址
參考:
https://blog.csdn.net/oqqHuTu12345678/article/details/82823890