我正在开发一个程序,该程序正在为立方体卫星项目创建 IRIG106 第 10 章数据。目前它正在 python 中实现,我很难实现第 10 章标题的最后一个组件。
我实现它的方式我目前发现校验和值大于规范定义的大小(2 个字节)的整数内的大小。
该标准在IRIG 106-09 标准的第 10.6.1.1 节“J”段中定义了标头校验和。它定义如下:
J 标头校验和。(2 字节) 包含一个值,该值表示标题中除标题校验和字之外的所有 16 位字的 16 位算术和。
还提供了一份编程手册,其中包含显示以下内容的示例 C 代码(来自第 A-2-17 页):
uint16_t I106_CALL_DECL uCalcHeaderChecksum(SuI106Ch10Header * psuHeader)
{
int iHdrIdx;
uint16_t uHdrSum;
uint16_t * aHdr = (uint16_t *)psuHeader;
uHdrSum = 0;
for (iHdrIdx=0; iHdrIdx<(HEADER_SIZE-2)/2; iHdrIdx++)
uHdrSum += aHdr[iHdrIdx];
return uHdrSum;
}
我使用BitString 库在 Python 中实现了以下内容:
def calculate_checksum(byte_data: BitArray = None, header_length_bytes: int = 24, chunk_length: int = 16):
# Set the checksum to zero:
checksum = 0
# Loop through the Chapter 10 header and compute the 16 bit arithmetic sum:
for bit_location in range(0, (header_length_bytes-2), chunk_length):
# Get the range of bits to select:
bit_range = slice(bit_location, (bit_location + chunk_length))
# Get the uint representation of the bit data found:
checksum += Bits(bin=byte_data.bin[bit_range]).uint
# Write the computed checksum as binary data to the start location of the checksum in the header:
byte_data.overwrite(Bits(uint=checksum, length=chunk_length), (header_length_bytes-2*8))
您可以提供的任何想法或见解将不胜感激。我知道这应该是一个简单的解决方案,但我只是看不到它。
--- 更新 2 --- 我尝试同时进行翻转和截断,它们都产生了相同的结果:
test_value = 2**16
test_value1 = test_value + 500
test_value2 = test_value1 % (2**16) -> 500
test_value3 = test_value1 & 0xFFFF -> 500
--- 更新 3 ---
当我比较 python 和 C 校验和函数的执行时,我遇到了以下情况,使用这些值作为规范的输入:
Sync = "EB25" (2 bytes)
ChannelID = 1 (2 bytes)
PacketLen = 1024 (4 bytes)
当我比较每个步骤的输出时,我看到以下内容:
C:
Header0: EB25
index = 0 16bit chunk = 60197 checksum = 60197
Header1: 0001
index = 1 16bit chunk = 1 checksum = 60198
Header2: 0400
index = 2 16bit chunk = 1024 checksum = 61222
Header3: 0000
index = 3 16bit chunk = 0 checksum = 61222
Python:
eb25
index: 0 chunk: 60197 checksum: 60197
0001
index: 1 chunk: 1 checksum: 60198
0000
index: 2 chunk: 0 checksum: 60198
0400
index: 3 chunk: 1024 checksum: 61222