第一组:刘聪 MD5加密介绍
1. MD5介绍
MD5全名Message Digest Algorithm 5 ,5是一种信息摘要算法,主要是通过特定的哈希散列方法将文本信息转换成简短的信息摘要,而且是绝对不可逆的。MD5具有很好的安全性,广泛的应用于登陆验证和数字证书。
2. C# MD5加密解密用于登录验证
引用:using System.Security.Cryptography;
- 加密:创建MD5对象,调用其ComputeHash()方法生成字节流,转化成字符串并返回。
- 解密: 由于MD5是不可逆的,所以加密之后就无法解密,取用password时候,需要加密输入的数据,再与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定密码正确。
第二组:冯佳丽 C# 网口传输总结
IPAddress localaddr = IPAddress.Parse(ip_value.Text);//端口号
int port_data;
port_data = Convert.ToInt32(port_value.Text);
IPEndPoint enhost = new IPEndPoint(localaddr, port_data);
private static Socket s = null;
//连接以太网
try
{
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(enhost);
}
catch (Exception ex)
{
//连接失败
MessageBox.Show("connect fail! " + ex.Message);
test.IsEnabled = false;
check ++;
check %= 2;
connect.Content = "连接";
}
finally
{
//连接成功
if (check % 2 == 0)
{
connect.Content = "断开";
test.IsEnabled = true;
}
}
//断开以太网
try
{
s.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
test.IsEnabled = false;
connect.Content = "连接";
//显示清空
speed.Text = "";
}
send_byte[0] = (Byte)'t';
send_byte[1] = (Byte)'e';
send_byte[2] = (Byte)'s';
send_byte[3] = (Byte)'t';
//发送命令
s.Send(send_byte, send_byte.Length, SocketFlags.None);
//接收数据
out_string = "";
bytes = s.Receive(recv_byte, recv_byte.Length, SocketFlags.None);
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
//时间计数
stopwatch.Start();
stopwatch.Stop();
TimeSpan timespan = stopwatch.Elapsed;
double ms = timespan.TotalMilliseconds;
//多线程
Thread tfer;
tfer = new Thread(new ThreadStart(BeginTransfer));//BeginTransfer为一方法名
tfer.IsBackground = true;
tfer.Priority = ThreadPriority.Highest;
tfer.Start();
//在副线程中调用主线程的函数
this.Dispatcher.Invoke(end);
if (tfer.IsAlive)
{
tfer.Abort();
tfer.Join();
tfer = null;
}
//写文件
string Filepath = "C:\\Users\\Administrator\\Desktop" + "\\" + "test.txt";
FileStream fs;
fs = new FileStream(Filepath, FileMode.Create);
fs.Position = fs.Length;
fs.Write(recv_byte, 0, bytes);
fs.Flush();
fs.Close();
第三组:蔡永坚Asp.Net底层解析-runat="server"
简单描述的话就是:ASP.NET将有runat=”server”标志的标签当作服务器控件,这些标签会被初始化成各个服务器控件的实例添加到Page的服务器控件树中,参与页面生命周期直至Render成浏览器可识别的html编码。
VSS的Web项目中专门安排了一个文件存放这些服务器控件的声明,如下图所示,[页面名称].aspx.designer.cs就是VSS自动生成的,它与[页面名称].aspx.cs文件以Partial的形式构成了该页面的后台类定义。
页面WebForm1.aspx的前台代码为:
[html] view plain copy
而WebForm1.aspx.designer.cs内自动生成的代码如下:
[csharp] view plain copy
public partial class WebForm1 {
protected global::System.Web.UI.WebControls.Label asplbl_Test;
protected global::System.Web.UI.HtmlControls.HtmlInputFile file_test;
}
VS自动为添加有runat="server"标志的标签找到对应的服务器控件类,并在designer.cs文件中声明全局变量,这样一来,所有添加有runat="server"标志就能够通过后台代码进行控制。
服务器控件大体上可以分为两大类,一类是HtmlControls(System.Web.UI.HtmlControls命名控件下的大部分类),一类是WebControls(命名空间System.Web.UI.WebControls下的类是ASP.NET自带的,用户可以自定义该类型服务器控件)。
HtmlControls相对来说理解起来比较简单,他们的基类都是HtmlControl类,而HtmlControl类继承Control类。HtmlControls中的控件都对应HTML标签的某一种,也就是说,这些HtmlControl控件是为各个HTML标签量身定做的,目的是为了在给某个HTML标签添加runat=”server”标志后,页面后台就能够为其自动生成相对应的HtmlControl服务器控件,从而在后台进行操控,如Form会转化为HtmlForm控件、Input转化为HtmlInputButton控件、Span转化为HtmlGenericControl控件等等(顺便提一句,那些没有什么“特色”的标签都会转化为HtmlGenericControl控件,像Span、Label、Div等等,一般只会到InnerHTML、Attributes等所有HTML标签共有的属性)。
WebControls则可看成是自定义控件,与HtmlControl不同的是,WebControl并不会仅限于生成某个特定Html标签,为了达到某种“组合效果”,WebControl最终会Render成多个Html标签,这些Html标签“相互配合”达到特定封装的效果。
总结来说,如果在ASPX页面上的标准Html标签加上runat=”server”标志后,ASP.NET就会自动创建对应HtmlControl控件类型的全局变量,从而能够在后台对其进行控制;如果在非标准Html标签中添加runat=”server”标志(一般都会这么做,否则不会被服务器解析而直接返回,这将导致浏览器服务识别),ASP.NET会试图根据Web.Config中关于服务器控件名称的设定找到对应的类型,并创建一个该类型的全局变量。
第四组:张元一 iOS开发:后台运行以及保持程序在后台长时间运行
EFB项目中,需要实现后台持续监控电量的功能,这可以拆分为三个需求:
- 程序需要保持在后台可以运行。
- 程序需要获取ipad精确电量。
- 需要每隔一段时间扫描一次电量,以获取当前有效的电量。
本文先讨论需求一的实现:
iOS 应用程序5个状态:
停止运行-应用程序已经终止,或者还未启动。
不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。
活动-app处于“使用中”的状态。
后台-app不再屏幕上显示,但它仍然执行代码。
挂起-app仍然驻留内存但不再执行代码。
按下Home键时,app从活动状态转入后台,绝大部分app通常在几秒内就从后台变成了挂起。
在内存吃紧的时候,iphone会首先关闭那些挂起的app。
从 iOS 4 开始,应用就可以在退到后台后,继续运行一小段时间(10 分钟);把自己声明为需要在后台运行,就能不限时地运行了。
不过限制为播放音乐、使用 GPS 、voip、。 值得一提的是,有的应用为了达到后台不限时运行的目的,在后台播放无声的音乐。
综上,考虑使用后台持续播放音乐的方式来实现。实现代码如下:
#pragma mark - 程序将要进入后台(墓碑状态)
- (void)applicationWillResignActive:(UIApplication *)application {
}
#pragma mark - 程序进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
[UIDevice currentDevice].batteryMonitoringEnabled = YES;
///***
//设置永久后台运行
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
//不管有没有完成,结束bgTask任务
[application endBackgroundTask:bgTask];
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
bgTask = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
bgTask = UIBackgroundTaskInvalid;
}
});
});
//开启后台任务
[self applyBackgrounTaskTime];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// NSLog(@"Starting background task with %0.1f seconds remaining", application.backgroundTimeRemaining);
[NSThread sleepForTimeInterval:600];
// NSLog(@"Finishing background task with %0.1f seconds remaining", application.backgroundTimeRemaining);
//告诉系统我们完成了 也就是要告诉应用程序:“好借好还”嘛。
//将任务标记为完成
[application endBackgroundTask:bgTask];
// 销毁后台任务标识符
bgTask = UIBackgroundTaskInvalid;
});
//开启定时器 不断向系统请求后台任务执行的时间
[self.timer fire];
}
//开启后台任务
- (void)applyBackgrounTaskTime
{
//__block UIBackgroundTaskIdentifier background_task;
UIApplication *application = [UIApplication sharedApplication];
//注册一个后台任务,告诉系统我们需要向系统借一些事件
self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^ {
//不管有没有完成,结束background_task任务
[application endBackgroundTask: self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
//异步
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//### background task starts
NSLog(@"Running in the background\n");
//循环播放无声的MP3
[self backGroundStart];
[NSThread sleepForTimeInterval:2];
//结束background_task任务
[application endBackgroundTask: self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
});
}
//播放MP3
- (void)backGroundStart
{
//AVAudioPlayer
//查找本地音乐文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"莫扎特-第3号法国号协奏曲" ofType:@"mp3"];
//构建URL
NSURL *url2 = [NSURL fileURLWithPath:filePath];
//创建音乐播放器
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url2 error:nil];
//根据URL地址来读取音乐文件(写在ViewDidLoad中会自动播放)
[_audioPlayer prepareToPlay];
_audioPlayer.numberOfLoops = -1;//循环
_audioPlayer.delegate = self;
[_audioPlayer play];
}
本项目demo的GitHub地址:
https://github.com/Frued/BatteryLevel
第五组:陈孚楠 匿名类型
创建一个对象,一定要先定义这个对象的类型吗?不一定的!来看看这段代码。
var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam = new int[] { 1, 2, 3, 4 } };
Console.WriteLine(obj.Empty);//另一个对象的属性名字,被原封不动的拷贝到匿名对象中来了。
Console.WriteLine(obj.myTitle);
Console.ReadKey();
new关键字之后就直接为对象定义了属性,并且为这些属性赋值。而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性
当把一个对象的属性拷贝到匿名对象中时,可以不用显示的指定属性的名字,这时原始属性的名字会被“拷贝”到匿名对象中
注意:
如果你监视变量obj,你会发现,obj的类型是Anonymous Type类型的
不要试图在创建匿名对象的方法外面去访问对象的属性!
优点:
这个特性在网站开发中,序列化和反序列化JSON对象时很有用!