Golang中如何使用Map验证PIDs的连续性计数器
Golang中如何使用Map验证PIDs的连续性计数器 大家好,我是Go语言的完全新手,需要完成以下任务。
我必须验证直播流数据包的连续性计数器。假设第一个数据包包含PID(数据包标识符)0且CC值为1,第二个数据包包含PID 1且CC值为1,第三个数据包包含PID 0且CC值为2。
数据包1 PID=0 CC=1
数据包2 PID=1 CC=1
数据包3 PID=0 CC=2
因此我需要基于PID来验证CC错误。第一个数据包是PID 0类型,第二个数据包不是PID 0类型,所以我需要存储第一个数据包供后续使用,然后继续处理下一个数据包。当遇到第三个数据包(PID 0类型)时,我需要比较第一个和第三个数据包:计算第三个数据包与第一个数据包的CC值差值(数据包3 CC - 数据包1 CC)。请告诉我该如何实现这个逻辑。正如我所说,我是个绝对的新手。
期待获得帮助。已经尝试编写了一些代码,但由于客户政策限制无法在此分享。
更多关于Golang中如何使用Map验证PIDs的连续性计数器的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中如何使用Map验证PIDs的连续性计数器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
以下是使用Go语言实现基于PID验证连续性计数器(CC)的示例代码。通过map存储每个PID的上一个CC值,并在遇到相同PID时比较当前CC与上一个CC的差值。
package main
import "fmt"
type Packet struct {
PID int
CC int
}
func validateContinuity(packets []Packet) {
// 使用map存储每个PID的上一个CC值
prevCC := make(map[int]int)
for i, packet := range packets {
prev, exists := prevCC[packet.PID]
if exists {
// 计算当前CC与上一个CC的差值
diff := packet.CC - prev
// 验证连续性(通常CC应该在0-15范围内循环)
expected := (prev + 1) % 16
if packet.CC != expected {
fmt.Printf("数据包%d (PID=%d): CC不连续! 当前CC=%d, 期望CC=%d, 差值=%d\n",
i+1, packet.PID, packet.CC, expected, diff)
} else {
fmt.Printf("数据包%d (PID=%d): CC连续, 差值=%d\n",
i+1, packet.PID, diff)
}
} else {
fmt.Printf("数据包%d (PID=%d): 首次出现, CC=%d\n",
i+1, packet.PID, packet.CC)
}
// 更新当前PID的CC值
prevCC[packet.PID] = packet.CC
}
}
func main() {
// 测试数据
packets := []Packet{
{PID: 0, CC: 1},
{PID: 1, CC: 1},
{PID: 0, CC: 2},
{PID: 0, CC: 4}, // 这个会显示不连续
{PID: 1, CC: 2},
}
validateContinuity(packets)
}
输出结果:
数据包1 (PID=0): 首次出现, CC=1
数据包2 (PID=1): 首次出现, CC=1
数据包3 (PID=0): CC连续, 差值=1
数据包4 (PID=0): CC不连续! 当前CC=4, 期望CC=3, 差值=2
数据包5 (PID=1): CC连续, 差值=1
代码说明:
- 定义
Packet结构体存储PID和CC值 - 使用
map[int]int跟踪每个PID的上一个CC值 - 对于每个数据包:
- 如果是该PID的首次出现,记录CC值
- 如果不是首次出现,计算当前CC与上一个CC的差值
- 验证CC是否连续(通常按模16循环递增)
- 更新map中该PID的最新CC值
这个实现能够处理任意数量的PID,并正确跟踪每个PID的CC连续性。CC值通常会在0-15范围内循环,所以使用模16运算来验证连续性。

