buildPMT(len_pat, pat, PMT); buildPMT未识别标识符
时间: 2024-10-29 11:24:52 浏览: 15
`buildPMT`函数通常是在KMP算法中用于构建模式串的失配指针数组(Partial Match Table,简称PMT)。这个函数的作用是计算模式串中各子串与其后续部分最长公共前后缀的长度。在C语言中,`buildPMT`函数可以这样描述:
```c
void buildPMT(int len_pat, const char* pat, int PMT[]) {
// 初始化数组,PMT[0]通常是0,因为空字符串的最长公共前后缀长度为0
PMT[0] = 0;
// 遍历模式串
for (int i = 1, j = 0; i < len_pat; ++i) {
// 如果当前字符和前一个字符匹配
if (pat[i] == pat[j])
j++;
// 如果当前字符不匹配,尝试向前回溯
else if (j > 0)
j = PMT[j - 1];
// 记录当前位置的最长公共前后缀长度
PMT[i] = j;
}
}
```
这个函数接收三个参数:
- `len_pat`: 模式串`pat`的长度
- `pat`: 指向模式串的指针
- `PMT`: 存储失配指针的数组
通过遍历模式串,对于每个位置`i`,`PMT[i]`记录了以`pat[i]`结尾的子串与之前剩余部分的最长公共前后缀长度。这是为了在匹配过程中能够快速判断如何调整搜索位置,避免无效的比较。
相关问题
提取 PAT PMT C语言
PAT(Program Association Table)和PMT(Program Map Table)是数字视频广播领域中的两个协议。
在C语言中,提取PAT和PMT需要进行以下步骤:
1. 打开TS文件,读取TS包,获取PAT表的PID值。
2. 读取TS包,判断PID是否为PAT表的PID值,如果是则解析PAT表。
3. 解析PAT表,获取PMT表的PID值。
4. 读取TS包,判断PID是否为PMT表的PID值,如果是则解析PMT表。
5. 解析PMT表,获取视频流和音频流的PID值。
6. 读取TS包,判断PID是否为视频流或音频流的PID值,如果是则提取数据。
下面是示例代码:
```c
#include <stdio.h>
typedef struct {
unsigned char table_id;
unsigned char section_syntax_indicator;
unsigned short section_length;
unsigned short transport_stream_id;
unsigned char version_number;
unsigned char current_next_indicator;
unsigned char section_number;
unsigned char last_section_number;
unsigned int program_number;
unsigned char reserved_3;
unsigned int network_PID;
unsigned int program_map_PID;
} PAT;
typedef struct {
unsigned char table_id;
unsigned char section_syntax_indicator;
unsigned short section_length;
unsigned int program_number;
unsigned char reserved_3;
unsigned char version_number;
unsigned char current_next_indicator;
unsigned char section_number;
unsigned char last_section_number;
unsigned short PCR_PID;
unsigned short program_info_length;
unsigned int stream_type;
unsigned short elementary_PID;
unsigned short ES_info_length;
} PMT;
int main() {
FILE *fp = fopen("test.ts", "rb");
if (fp == NULL) {
printf("Open file failed!\n");
return -1;
}
unsigned char buffer[188];
PAT pat;
PMT pmt;
while (fread(buffer, 1, 188, fp) == 188) {
// 判断PID是否为PAT表的PID值
if (buffer[1] == 0x00) {
pat.table_id = buffer[0];
pat.section_syntax_indicator = (buffer[1] >> 7) & 0x01;
pat.section_length = ((buffer[1] & 0x0f) << 8) | buffer[2];
pat.transport_stream_id = (buffer[3] << 8) | buffer[4];
pat.version_number = (buffer[5] >> 1) & 0x1f;
pat.current_next_indicator = buffer[5] & 0x01;
pat.section_number = buffer[6];
pat.last_section_number = buffer[7];
pat.network_PID = ((buffer[8] & 0x1f) << 8) | buffer[9];
pat.program_map_PID = ((buffer[10] & 0x1f) << 8) | buffer[11];
}
// 判断PID是否为PMT表的PID值
else if (buffer[1] == pmt.program_map_PID) {
pmt.table_id = buffer[0];
pmt.section_syntax_indicator = (buffer[1] >> 7) & 0x01;
pmt.section_length = ((buffer[1] & 0x0f) << 8) | buffer[2];
pmt.program_number = (buffer[3] << 8) | buffer[4];
pmt.version_number = (buffer[5] >> 1) & 0x1f;
pmt.current_next_indicator = buffer[5] & 0x01;
pmt.section_number = buffer[6];
pmt.last_section_number = buffer[7];
pmt.PCR_PID = ((buffer[8] & 0x1f) << 8) | buffer[9];
pmt.program_info_length = ((buffer[10] & 0x0f) << 8) | buffer[11];
int i = 12 + pmt.program_info_length;
while (i < 12 + pmt.section_length - 4) {
pmt.stream_type = buffer[i];
pmt.elementary_PID = ((buffer[i+1] & 0x1f) << 8) | buffer[i+2];
pmt.ES_info_length = ((buffer[i+3] & 0x0f) << 8) | buffer[i+4];
i += 5 + pmt.ES_info_length;
}
}
// 提取视频流或音频流的数据
else if (buffer[1] == pmt.elementary_PID) {
// TODO: 提取数据
}
}
fclose(fp);
return 0;
}
```
numpy_finance的pmt函数
numpy_finance库中的pmt函数用于计算等额本息还款方式下的每期应还款金额。其语法如下:
numpy_finance.pmt(rate, nper, pv, fv=0, when='end')
参数说明:
- rate:每期利率。
- nper:总期数。
- pv:贷款本金。
- fv:贷款期末剩余本金,默认为0。
- when:还款期数的时间点,默认为'end',表示每期还款末尾时还款。
返回值为每期应还款金额。
例如,假设贷款本金为10000元,年利率为5%,分12期还款,最终期末不留余额,则每期应还款金额为:
```python
import numpy_financial as npf
pv = 10000 # 贷款本金
rate = 0.05/12 # 每期利率
nper = 12 # 总期数
fv = 0 # 最终期末不留余额
pmt = npf.pmt(rate, nper, pv, fv=fv)
print(pmt) # 输出结果为 -862.48
```
因此,每期应还款金额为862.48元。
阅读全文