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

1 回复

更多关于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

代码说明:

  1. 定义Packet结构体存储PID和CC值
  2. 使用map[int]int跟踪每个PID的上一个CC值
  3. 对于每个数据包:
    • 如果是该PID的首次出现,记录CC值
    • 如果不是首次出现,计算当前CC与上一个CC的差值
    • 验证CC是否连续(通常按模16循环递增)
  4. 更新map中该PID的最新CC值

这个实现能够处理任意数量的PID,并正确跟踪每个PID的CC连续性。CC值通常会在0-15范围内循环,所以使用模16运算来验证连续性。

回到顶部