.net搜索 实现过程 svm求解过程

6863人阅读
数字电视(3)
1、名词概念:
接收控制系统/条件接收系统 :该系统的任务是保证DVB业务仅被授权接收的用户所接收,其主要功能是对信号加扰,对用户电子密钥的加密以及建立一个确保被授权的用户能接收到加扰节目的用户管理系统
控制字或密钥:CW (Control Word )
节目映射表:PMT (Program Map Table )
条件接收表:CAT (Conditional &Access Table )
授权控制信息:ECM (Entitlement Control Message )
授权管理信息:EMM (Entitlement Management Message )
脉冲式按次付费电视或者即时付费电视:IPPV(Impluse Pay-per-View )
模拟电视:采用模拟信号调制,中间很容易引入干扰,一套节目使用一个频点
数字电视:采用数据信号调制,抗干扰性好,一个频点传输6-8套节目,容易加密
2、条件接收系统的组成
整个条件接收系统包括前端码流加扰加密、传输、终端通过条件接收系统进行解扰解密这三大部分,其中关键技术就在前端和终端。
&&前端码流加扰加密部分包括有:
→EMM加密器
→ECM加密器
→CW发生器
→TS流加扰器
&&终端条件接收系统进行解扰解密部分包括有:
→解复用器
加扰控制字段:
可以在ts包中的 transport_scrambling_control 值:2b位,ts header第四个字节处
位值 &描述
00 & & 不加扰
01 & & 保留
10 & &用偶密钥加扰ts包
11 & &用奇密钥加扰ts包
PES包中使用 PES_scrambling_control值,其控制与ts相同含义
3、条件接收系统原理图
三层加密:
发送端:采用PDK对SK进行加密,传输加密后的EMM数据
接收端:PDK是存储在智能卡上的,是智能卡的ID,这是唯一的,机顶盒收到EMM数据采用PDK解出SK
4、条件接收系统工作原理(文字描述)
前端码流加密加扰工作原理:
1、在信号的发送端,首先由控制字发生器产生控制字(CW),将它提供给加扰器和加密器A。控制字的典型字长为64bit,每隔2~30s改变一次(CW变化为5-10s,各家值有所不同)。
2、加扰器根据控制字发生器提供的控制字,对来自复用器的MPEG-2传送比特流进行加扰运算。此时,加扰器的输出结果即为经过扰乱了以后的MPEG-2传送比特流,控制字就是加扰器加扰所用的密钥。
3、加密器接收到来自控制字发生器的控制字后,则根据用户授权系统提供的业务密钥对控制字进行加密运算,加密器A的输出结果即为经过加密以后的控制字,它被称为授权控制信息(ECM).
4、用户管理信息(Management Message)被密钥EMMK1加密形成授权管理信息(EMM),用户管理信息由信息提供商的用户管理系统形成,用户管理系统用来建立有关用户的名称、地址、智能卡号、账单的信息和当前授权的数据库等等.
5、经过这样一个过程产生的ECM和EMM信息均被送至MPEG-2复用器或复用器,与被送至同一复用器的图像、声音和数据信号比特流一起打包成MPEG-2传送比特流输出
终端解扰解密部分工作原理:
1、在信号的接收端,解码器首先在传送流中查找到PMT和CAT表,从中获取到EMM_PIDS,ECM_PIDS,CASystemIDS等信息.
2、根据EMM_PID,找到相应的加密的EMM信息,智能卡中存有加密系统号和ECM密钥,EMM密钥等,智能卡首先使用EMM密钥对加密的EMM解密,根据解出的EMM信息来确定本智能卡是否被授权看该套节目,如没授权则不能进行后续的解密,也不就不能收看该节目.
3、如该卡已被授权,则利用ECM_PID,找到相应的加密的ECM信息,利用智能卡的ECM密钥对ECM进行解密,得到控制字CW.
4、由解密得出来的CW对加扰的传送流进行解密,得到正常的MEPG-2传送流,由解码器解码后得到所需的电视,广播或数字信号.
加扰和加密的区别:
加扰是加扰器使用控制字通过函数运算产生伪随机序列,对数据进行一些与或运算将数据扰乱。接收终端只有得到控制字才能通过反函数运算将数据还原进行解码。而加密是为了有效的保护控制字进行的,通过密钥或算法对控制字进行加密。终端设备需要得到密钥或反算法,解出或算出控制字,再进行解扰解密工作。
TS层的加扰:
TS层的加扰只针对TS数据码流的有效负载(payload),而TS码流中的PSI信息,包括PAT、PMT、NIT、CAT以及私有分段(包括ECM、EMM)都不应该被加扰。当然,TS流的头字段(包括调整字段)也不应该被加扰。经过加扰后的TS码流应该在头字段中定义加密控制值。
5、PSI数据接收
接收到相应的PMT和CAT表,这两个表中可能会存在CA_descriptor()的描述符,通过该描述符号,可以获取到对应的EMM_PIDS,ECM_PIDS,CASystemIDS。
CA_descriptor()介绍:
CA_system_ID : 表示适用于相关ECM和EMM流的相关的CA系统类型(CA厂家标识符).
CA_PID : PMT表中的该描述信息为ECM的PID,CAT 表中的该描述信息为EMM的PID.
一般来说,ecm table id为0x80/0x81,emm table id为0x82~0x8F这个值是由ca厂家决定的。
ca_descriptor 描述字值为0x09, 下面给个加扰流的具体表数据:
完整接收及播放流程:
1、锁定指定频点
2、搜索PAT表
3、搜索CAT及PMT表
4、解析PMT表得到ECM PID值,解析CAT表得到EMM PID值
5、将ECM及EMM送到智能卡解密
6、智能卡返回CW值,机顶盒将CW值设到demux descrambler解扰模块,还原原始码流
7、设定音频pid,视频pid进行解码和播放
6、集成ca lib工作
一般利用现有的中间件中CA模块进行集成,说明一下这种最通常的工作流程
1、提供编译器及编译参数,ca厂商提供ca lib/ca header及ca test stream&
2、实现descrambler,smartcard,demux, flash 等模块接口
3、实现ca lib需要实现的接口函数,一般包含os,filter,descrambler等接口
4、开发一套应用调用ca lib提供函数实现业务呈现
5、调通加扰节目的播放及业务的呈现ok
6、到ca公司进行ca认证,测试ok后进入运营阶段
7、补充一下这两天调试碰到的问题
a、机卡通讯有问题&
&& & & 出现sc_send数据成功但无法接收数据,总是报超时错误,可能原因
&& & &1、与智能卡设定的波特率有关,一般设定为4800bits/s或者9600bits/s,而在收到ATR消息一般以atr[2]&0x0f作为baud factor的调节因子
&& & & & & 【波特率校正因子1、2*n (n=1~16) ,具体设置参考协议D因子和卡特性&】
&& & &2、与智能卡设定的时钟率因子有关 【时钟转率因子372~2048 ,具体设置参考协议的F因子和卡特性】
b、智能卡配对失败
&& & &请保证智能卡,码流及CA库统一,不要用错了
c、授权信息出现&access denied &,即未授权
&& & &请确认ca卡是不授权且其未过授权时间,其流里面有授权信息
d、ecm&emm数据未收到或超时
&& & &请先确认码流中和pid及过滤参数是否正确,可以录码流通过专业软件查看,再 确认demux接口的filter过滤参数是否有问题
e、set key失败
&& & 一般只要set pid(av)成功,基本上set key 都会成功,这是机顶盒通用的接口,一般不会出问题
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:784851次
积分:10894
积分:10894
排名:第752名
原创:158篇
转载:45篇
评论:304条
文章:37篇
阅读:186509
(1)(6)(1)(2)(1)(2)(2)(1)(2)(1)(1)(1)(5)(1)(3)(6)(3)(4)(4)(3)(1)(8)(1)(3)(11)(12)(16)(7)(16)(13)(9)(22)(24)(1)(10)怎么实现.net平台推送IOS信息 求各路大神指教_百度知道
怎么实现.net平台推送IOS信息 求各路大神指教
最好有代码
提问者采纳
CertificatePath.Error(&quot, string oldSubscriptionId.WithSound(&quot,网上搜一下;
pusher,需要有苹果的证书以及密码(怎么获取;&#47,需要交费的)3.获取推送出错的信息
}static void pusher_OnDeviceSubscriptionExpired(object sender, string expiredSubscriptionId;推送内容&quot.Core,.QueueNotification(new AppleNotification();
&#47.WithAlert(&
pusher, INotification notification)
&#47, INotification notification)
// 从数据库删除过期的expiredSubscriptionId
}static void pusher_OnDeviceSubscriptionChanged(object sender,推送代码pusher.ReadAllBytes(CertificatePath);}static void pusher_OnNotificationFailed(object sender..A推送的内容&quot.OnDeviceSubscriptionExpired += pusher_OnDeviceSubscriptionE));,安装了该ios应用程序4;推送出错的信息&quot.;+n.net 项目中引用PushS),定义全局的对象PushBroker pusher = new PushBroker().A消息推送成功后
var n = (AppleNotification)notification.RegisterAppleService(new ApplePushChannelSettings(F6,有源码的)5.Payload.OnNotificationSent += pusher_OnNotificationSent:证书的路径CertificateP
/default& 把数据库中的oldSubscriptionId更新为newSubscriptionId
}复制代码startApp()方法中有两个参数.Message , CertificatePassword)).Body), INotification notification)
/&#47.WithBadge(1);
}static void pusher_OnNotificationSent(&#47.OnDeviceSubscriptionChanged += pusher_OnDeviceSubscriptionC&#47.ForDeviceToken(TokenID) .Apple:密码7.dll.OnNotificationFailed += pusher_OnNotificationFailed,iphone手机一部, Exception error)
var n = (AppleNotification)notification,开始写代码.
L&#47, string newSubscriptionId..dll(这两个文件在网上搜一下,PushSn, DateTime expirationDateUtc.Payload.Body
获取推送的消息内容.;
pusher,ios应用程序中允许向客户推送消息2, error).Error(&quot, INotification notification,注册方法复制代码protected void startApp()
pusher资料来源于网上1; 从数据库或者其他等地方获取设备的TokenID,每个iphone一个TokenID8
这代码是写在哪里的啊
提问者评价
采纳率100%
其他类似问题
为您推荐:
ios的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁今日: 5|昨日: 573|帖子: 736180|会员: 201193|欢迎新会员:
12345678910
12345678910
12345678910
酒城人民欢欢喜喜过新年。。。
2月2日晚,由泸州市委宣传部、泸州市文化体育新闻出版广电局主办,泸州新闻网、泸州人
今天和极卡黄总去龙马潭区鱼塘街道看望黄修文, 街
分区版主: , , , , ,
主题: 529, 帖数: 3638
主题: 1832, 帖数: 3910
主题: 2万, 帖数: <span title="万
主题: 95, 帖数: 1万
主题: 6843, 帖数: 3万
分区版主: , , , ,
主题: 486, 帖数: 5442
主题: 19, 帖数: 275
主题: 805, 帖数: 1万
主题: 84, 帖数: 512
主题: 211, 帖数: 1万
主题: 414, 帖数: 6431
主题: 4060, 帖数: 4万
主题: 1625, 帖数: 1万
主题: 1741, 帖数: 5万
主题: 206, 帖数: 1204
主题: 1428, 帖数: 9622
主题: 1407, 帖数: 5585
泸州全搜索 泸女郎俱乐部 展示泸州女性风采版主:
分区版主: ,
主题: 1860, 帖数: 9392
主题: 484, 帖数: 1290
主题: 1475, 帖数: 5021
主题: 3683, 帖数: 7773
主题: 1385, 帖数: 4048
主题: 257, 帖数: 391
主题: 13, 帖数: 32
主题: 309, 帖数: 3655
主题: 9, 帖数: 22
主题: 1189, 帖数: 6297
分区版主: ,
主题: 37, 帖数: 417
主题: 77, 帖数: 1725
主题: 81, 帖数: 668
主题: 63, 帖数: 631
主题: 146, 帖数: 1139
主题: 43, 帖数: 344
主题: 69, 帖数: 945
主题: 101, 帖数: 402  在文章:&与&中,介绍了的基本使用情况以及部分技术细节,我还没有在实际系统中大量使用,但文章发布后,有不少网友(&)反应在实际项目中使用过,效果还可以吧。同时也有人碰到了关于关于分页的问题,还不止一个网友,很显然这个问题从我的思考上来说,作者不可能不支持,同时也翻了一下源码,发现Find方法有skip和limite参数,直觉告诉我,这就是的。但是网友进一步提问,这个方法并不是很好用,它也没有实现的分页的情况。所以就亲自操刀,看看到底是神马情况?不看不知道,这个过程还真的不是那么回事,不过还是能解决啊。
.NET开源目录:
本文原文地址:
1.关于数据库排序与分页
&&&&在实际的项目中,对于关系型数据库,数据查询与排序都应该好办,升序或者降序呗,但是对数据库的分页应该不是直接的函数支持,也需要自己的应用程序中进行处理,然后使用top或者limite之类的来查询一定范围内的数据,作为一页,给前台。例如下面的SQL语句:
&Select&top&PageSize&*&from&TableA&where&Primary_Key&not&in&
&&&&&&&&&&&&&&&&&(select&top&(n-1)*PageSize&Primary_Key&from&TableA&)
&&&&&数据的分页过程中,我们也看到在根据指定条件查询后,就是记录集的筛选,所以对于NoSQL数据库来说,因为没有了SQL,这些问题不会像常规关系型数据库那么突出,毕竟你选择了NoSQL,在大数据面前,如果动不动就查几千条数据来分页,也是明显不合适的。在我的观点中,要尽量避免无谓的查询浪费,也不会有人专门去看几千甚至几万条记录,如果有,也只是从中找到一部分数据,既然这样何必不一开始就增加条件,过滤掉那些没用的数据呢。所以数据库的那些事,业务的合理性也很重要,数据库也是机器,他们能力也有限,动不动就仍那么多沉重的任务给它,也会受不了啊。
2.LiteDB的查询排序
2.1 测试前准备工作
&&&&为了便于本文的相关代码演示,我们使用如下的一个实体类,注意Id的问题我们在前面一篇文章中已经说过了,默认是自增的,不需要处理。加进来是为了方便查询和分页。实体类基本代码如下:
public&class&Customer
///&&summary&自增Id,编号&/summary&
public&int&Id&{&&&}
///&&summary&年龄&/summary&
public&int&Age&{&&&}
///&&summary&姓名&/summary&
public&string&Name&{&&&}
&&&&然后我们使用如下的方法插入20条记录,注意该函数是数据初始化,只需要运行一次即可。会在bin目录生成Sample数据库文件。我们只拿这些数据做测试。至于以后大数据的查询以及分页效率问题,暂时不考虑,我们只单独处理分页的情况。
static&void&InitialDB()
//打开或者创建新的数据库
using&(var&db&=&new&LiteDatabase("sample.db"))
//获取&customers&集合,如果没有会创建,相当于表
var&col&=&db.GetCollection&Customer&("customers");
for&(int&i&=&0;&i&&&20;&i++)
//创建&customers&实例
var&customer&=&new&Customer
{&&&//名字循环改变
Name&=&i&%&2&==&1&?&"Jim1_"&+&i.ToString()&:&"Jim2"&+&i.ToString(),
//&将新的对象插入到数据表中,Id是自增,自动生成的
col.Insert(customer);
上面的Name是交替改变的,Jim1和Jim2加上编号,而Age是默认逐步增加了,主要是为了测试排序的情况。
2.2 基本查询与分页问题
& & 我们在前面介绍的基础文章。。中,对基本查询做了介绍。方法很灵活。针对上面的例子,我们假设一个查询分页的需求:
&&&&查Customer表中,Name以"Jim1"开头的人集合,按Age降序排列,每3条记录一页,打印每一页的Age列表。
针对上面问题,我们需要先简单分析一下问题:
1.查询获取记录的总数,可以使用Find或者Count方法直接获取;
2.查询条件的是Name,可以使用Linq或者Query来进行;
3.由于LiteDB是NoSQL的,所以不支持内部直接排序了,只能使用Linq的OrderBy或者OrderByDescending了;
4.关于分页,还是选择和SQL数据库类型的方法,使用linq的skip方法来跳过一些记录。这里留个疑问,因为自己技术有限,平时也只使用基本的linq操作,所以只想到了Skip,知道的朋友接着往下看,别吐槽。解决问题的最终结果可能很简单,但是过程还是值得回味的,一步步也是学习和总结优化的过程。
3.LiteDB分页之渐入佳境
& & 由于Linq的Take以前不知道,所有走了一些弯路,同时LiteDB的Find方法中的重载函数之一,skip参数也有一些问题,下一节讲到具体问题。
3.1 第一次小试牛刀
&&&&考虑到类似SQL的limite和top查询,我们也在中使用这种方式。由于Linq有一个Skip方法,所以选择它来完成具体数据的选择,相当于每次都选择最后几条。看代码:
//打开或者创建新的数据库
using&(var&db&=&new&LiteDatabase("sample.db"))
//获取&customers&集合,如果没有会创建,相当于表
var&col&=&db.GetCollection&Customer&("customers");
//1.计算总的数量
var&totalCount&=&col.Count(Query.StartsWith("Name",&"Jim1"));
//2.计算总的分页数量
Int32&pageSize&=&3&;//每一页的数量
var&pages&=&(int)Math.Ceiling((double)totalCount&/&(double)pageSize);
//3.循环获取每一页的数据
Int32&current&=&int.MaxV
for&(int&i&=&0;&i&&&&i++)
{&&&&&&&&&&&&&&&&&&//查找条件,附加了Id的范围,第一次是最大,后面进行更新
var&data&=&col.Find(n&=&&n.Name.StartsWith("Jim1")&&&&n.Id&&&current)
&&.OrderBy(n&=&&n.Age)&//要求是降序,由于要选择最后的,只能先升序
&&.Skip(totalCount&-&(i&+&1)&*&pageSize)//跳过前面页的记录
&&.OrderByDescending(n&=&&n.Age);&//降序排列
current&=&data.Last().Id;//更新当前查到的最大Id
//把Id按照页的顺序打印出来
String&res&=&String.E
foreach&(var&item&in&data.Select(n&=&&n.Age))&res&+=&(item.ToString()&+&"&,&");
Console.WriteLine(res);
结果如下:
&&&&最后1也只有1条记录,总共10条记录也是正常的,总共20条,交替插入的。缺点有几个:
1.效率比较低,每次都选最后的
2.只能从第1页获取,不能获取单独页的,因为上一次的Id不能得到
3.2 完全使用Linq分页
&&&&后来发现了Take方法,虽然我猜测应该有,但苦于自己疏忽,导致寻找的时候错过了,后来自己打算重新写一个的时候,又去确认一遍的时候才发现。因为skip都可以实现,没道理Take不实现啊,原理都是一样的。如果实现也很简单的。那看看改进版的基于Linq的分页。没有上面那么麻烦了:
//根据页面号直接获取
static&void&SplitPageByPageIndex(int&index)
using&(var&db&=&new&LiteDatabase("sample.db"))
var&col&=&db.GetCollection&Customer&("customers");
//1.计算总的数量
var&totalCount&=&col.Count(Query.StartsWith("Name",&"Jim1"));
//2.计算总的分页数量
Int32&pageSize&=&3;//每一页的数量
var&pages&=&(int)Math.Ceiling((double)totalCount&/&(double)pageSize);
&&&//查询条件
var&data&=&col.Find(n&=&&n.Name.StartsWith("Jim1"))
&&.OrderByDescending(n&=&&n.Age)//降序
&&.Skip(index&*&pageSize)&//跳过前面页数数量的记录
&&.Take(pageSize);&//选择前面的记录作为当前页
//把id按照顺序打印出来
String&res&=&String.E
foreach&(var&item&in&data.Select(n&=&&n.Age))&res&+=&(item.ToString()&+&"&,&");
Console.WriteLine(res);
结果如下:
&&&&和上面是一样的,但这个显然要简洁多了。更加灵活,而且不用降序和升序直接转换,一次就够。
3.3 终极解决之扩展分页方法
&&&&根据上面方法,我们可以扩展到中去,虽然我一直认为这一点可以做到,但是研究了很久的源码,测试一直不成功,详细内容第4节介绍。
我选择直接在源代码里面扩展,当然也可以单独写一个扩展方法,不过源码里面更好用,相当于给Find增加一个重载方法,我们在源代码的Find.cs中增加下面的方法,详细看注释:
///&&summary&分页获取记录&/summary&
///&&typeparam&name="TOder"&排序字段类型&/typeparam&
///&&param&name="predicate"&linq查询表达式&/param&
///&&param&name="orderSelector"&排序表达式&/param&
///&&param&name="isDescending"&是否降序,true降序&/param&
///&&param&name="pageSize"&每页大小&/param&
///&&param&name="pageIndex"&要获取的页码,从1开始&/param&
///&&returns&分页后的数据&/returns&
public&IEnumerable&T&&FindBySplitePage&TOder&(Expression&Func&T,&bool&&&predicate,
Func&T,&TOder&&orderSelector,&Boolean&isDescending,&int&pageSize,&int&pageIndex)
var&allCount&=&Count(predicate);//计算总数
var&pages&=&(int)Math.Ceiling((double)allCount&/&(double)pageSize);//计算页码
if&(pageIndex&&&pages)&throw&new&Exception("页面数超过预期");
if&(isDescending)//降序
return&Find(predicate)
&&.OrderByDescending(orderSelector)
&&.Skip((pageIndex&-&1)&*&pageSize)
&&.Take(pageSize);
else&//升序
return&Find(predicate)
&.OrderBy(orderSelector)
&.Skip((pageIndex&-&1)&*&pageSize)
&.Take(pageSize);
下面还是使用上面的例子,直接进行调用:
var&db&=&new&LiteDatabase("sample.db");
var&col&=&db.GetCollection&Customer&("customers");
//取第二页,降序
var&data&=&col.FindBySplitePage&Int32&(n&=&&n.Name.StartsWith("Jim1"),&n&=&&n.Age,&true,&3,&2).ToList();
//把id按照顺序打印出来
String&res&=&String.E
foreach&(var&item&in&data.Select(n&=&&n.Age))&res&+=&(item.ToString()&+&"&,&");
Console.WriteLine(res);
Console.WriteLine("任务完成");
结果如下,调用总体比较简单,直接使用linq,输入页面数量和页码就可以了。当然不需要排序也可以,大家可以根据实际情况优化一下。
&&&&到这里,分页的问题基本是解决了,但还得说一下研究LiteDB遇到的坑。
4.LiteDB的疑问
&&&&先看看下面一段普通的代码,查询出来的记录的Id的变化情况,没有排序:
using&(var&db&=&new&LiteDatabase("sample.db"))
var&col&=&db.GetCollection&Customer&("customers");
var&data&=&col.Find(n&=&&n.Name.StartsWith("Jim1"));//普通查询
//把Id按照页的顺序打印出来
String&res&=&String.E
foreach&(var&item&in&data.Select(n&=&&n.Id))&res&+=&(item.ToString()&+&"&,&");
Console.WriteLine(res);
结果如下:
2&,&12&,&14&,&16&,&18&,&20&,&4&,&6&,&8&,&10&,
&&&&是不是很奇怪?没有想象的是按照顺序输出。所以这个坑花了我好长时间,怎么试就是不行,既然这样的话,那么使用LiteDB自带的下面这个方法:
public&IEnumerable&T&&Find(Expression&Func&T,&bool&&&predicate,&int&skip&=&0,&int&limit&=&int.MaxValue)
&&&&就有问题。这个方法skip的是按照上述顺序的。所以追根到底,还是因为直接的使用排序的方法?这里打个问号吧,说不定有,我没找到。如果有人比较熟悉的,可以告知一下,非常感谢。但是使用linq的方式也很容易的解决问题,应该差不了多少。
&&&&本文的代码比较简单,所有代码都已经贴在上面了。所以就不放具体代码了,我打算好好把LiteDB的源码研究一下,为以后正式的抛弃Sqlite做准备。大家关注博客,如果研究比较深入,会把相关代码托管到github。这里研究还不够深入,代码比较简单,就省略了吧。
阅读(...) 评论()C# 对PPT进行内容搜索出现未实现该方法异常,求解决!!
[问题点数:35分]
C# 对PPT进行内容搜索出现未实现该方法异常,求解决!!
[问题点数:35分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 excel规划求解 的文章

 

随机推荐