字符编码与行尾序列

在计算机中,所有数据都是以二进制数的形式存储的,字符 char 也不例外。为了表示字符,我们需要建立一套“字符集”,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。 ASCII 字符集 ASCII 码是最早出现的字符集,其全称为 American Standard Code for Information Interchange(美国标准信息交换代码)。它使用 7 位二进制数(一个字节的低 7 位)表示一个字符,最多能够表示 128 个不同的字符。如图 3-6 所示,ASCII 码包括英文字母的大小写、数字 0 ~ 9、一些标点符号,以及一些控制字符(如换行符和制表符)。 ...

2025年7月24日 · 5 分钟 · 2201 字

分布式锁

分布式锁是一种用于在分布式系统中实现并发控制的机制。在分布式系统中,多个节点同时访问共享资源可能导致数据不一致或冲突的问题。分布式锁可以确保在任意时刻只有一个节点可以访问共享资源,从而避免并发冲突。 分布式锁通常使用的是互斥锁(Mutex)的概念,它可以保证在同一时刻只有一个节点能够获取到锁,其他节点需要等待。一旦一个节点获取到了分布式锁,它就可以执行需要保护的临界区代码,执行完成后释放锁,其他节点才能继续竞争获取锁。 ...

2025年7月24日 · 2 分钟 · 697 字

异或

异或(Exclusive OR,简称 XOR)是一种数学运算符,常用于逻辑运算与计算机中的位运算。当且仅当两个输入值不同时,异或运算输出为真(1),否则输出为假(0),即“同为 0,异为 1”。异或运算可以通过数学符号“⊕”表示, 具有交换律、结合律、恒等律等性质。 ...

2025年7月23日 · 2 分钟 · 672 字

git工作流

git clone // 到本地 git checkout -b xxx 切换至新分支xxx (相当于复制了remote的仓库到本地的xxx分支上 修改或者添加本地代码(部署在硬盘的源文件上) git diff 查看自己对代码做出的改变 git add 上传更新后的代码至暂存区 git commit 可以将暂存区里更新后的代码更新到本地git git push origin xxx 将本地的xxxgit分支上传至github上的git (如果在写自己的代码过程中发现远端GitHub上代码出现改变) ...

2025年7月23日 · 1 分钟 · 422 字

树莓派wifi配置

wpa_supplicant.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=CN network={ ssid=“cxy” psk=“cxy12345@2” key_mgmt=WPA-PSK }

2025年7月23日 · 1 分钟 · 10 字

特性和反射

以下是一个示例,展示了如何定义和使用特性,并使用反射来获取特性信息: using System; using System.Reflection; // 自定义特性类 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] class MyCustomAttribute : Attribute { public string Description { get; } public MyCustomAttribute(string description) { Description = description; } } // 带有特性的类 [MyCustom("This is a class attribute")] class MyClass { [MyCustom("This is a method attribute")] public void MyMethod() { Console.WriteLine("Hello from MyMethod"); } } class Program { static void Main() { // 使用反射获取类的特性 Type classType = typeof(MyClass); MyCustomAttribute[] classAttributes = (MyCustomAttribute[])classType.GetCustomAttributes(typeof(MyCustomAttribute), true); foreach (MyCustomAttribute attribute in classAttributes) { Console.WriteLine("Class Attribute: " + attribute.Description); } // 使用反射获取方法的特性 MethodInfo methodInfo = classType.GetMethod("MyMethod"); MyCustomAttribute[] methodAttributes = (MyCustomAttribute[])methodInfo.GetCustomAttributes(typeof(MyCustomAttribute), true); foreach (MyCustomAttribute attribute in methodAttributes) { Console.WriteLine("Method Attribute: " + attribute.Description); } // 等待用户输入,防止控制台窗口关闭 Console.ReadLine(); } } 在这个示例中,我们首先定义了一个自定义特性类 MyCustomAttribute,它继承自 Attribute。然后,我们在 MyClass 类和 MyMethod 方法上应用了 MyCustomAttribute 特性,并传入了相应的描述信息。 ...

2025年7月23日 · 1 分钟 · 449 字

Fetch、Ajax和Axios

Fetch、Ajax和Axios都是用于进行客户端和服务器之间的数据通信的工具,它们有一些区别: 语法和用法:Fetch是浏览器原生提供的API,使用起来相对较为简洁,基于Promise。它使用fetch()函数发送请求,并通过.then()方法处理响应。Ajax是一种基于XMLHttpRequest对象的技术,需要手动编写XHR对象的代码,并处理回调函数。而Axios是一个独立的第三方库,提供了更简洁的API,使用起来更加直观和方便。 跨域请求:Fetch在进行跨域请求时需要设置特定的HTTP头部信息,如Access-Control-Allow-Origin。Ajax在跨域请求时也需要设置相应的HTTP头部信息。Axios在默认情况下支持跨域请求,并且提供了更简单的配置选项来处理跨域请求。 功能和扩展性:Fetch提供了基本的请求和响应功能,但在处理复杂的请求和响应方面相对较为简单。Ajax相对于Fetch来说功能更为丰富,可以更灵活地处理请求和响应,还可以通过设置XHR对象的属性来实现更高级的功能。Axios提供了更丰富的功能,如拦截请求和响应、请求和响应的转换、取消请求等,并且支持Promise API,可以更好地处理异步操作。 浏览器兼容性:Fetch是浏览器原生提供的API,但在一些旧版本的浏览器中可能不支持。Ajax是一个较为传统的技术,几乎所有的浏览器都支持。Axios是一个独立的第三方库,可以在大多数现代浏览器中使用,但需要引入相应的库文件。 综上所述,Fetch是浏览器原生提供的API,语法简洁但功能相对较为基础;Ajax是一种传统的技术,功能丰富但使用稍显复杂;Axios是一个独立的第三方库,提供了简洁的API和丰富的功能,推荐在现代化的前端开发中使用。选择使用哪种工具取决于你的需求和项目的特定情况。

2025年7月23日 · 2 分钟 · 767 字

钩子在Win7下无效

最近工作需要,用到了鼠标钩子,并且还是全局鼠标钩子,也就是说,这个钩子监视系统所有消息,因此启动这个功能后,发现程序性能有点受影响,这也是正常的。 但是,原本在xp上运行好好的,放到win7上进行测试,发现过段时间,钩子会自动无效掉,这个时候去人工卸载钩子会弹出无效句柄错误消息(Error Code: 1404)。 ...

2025年7月23日 · 2 分钟 · 743 字

什么是IntPtr

IntPtr是一种特殊的数据类型,它通常用于在编程语言中表示指针或句柄的整数值。“IntPtr"是"Integer Pointer"的缩写。 在许多编程语言中,指针是一种变量,它存储了内存地址的值,可以用来访问内存中的数据。然而,某些编程语言不直接支持指针,或者在特定的上下文中需要使用整数值来表示指针。这时,可以使用IntPtr类型来存储指针或句柄的整数值。 ...

2025年7月23日 · 2 分钟 · 723 字

什么是S.O.L.I.D

S.O.L.I.D 是一個面向對象設計(Object-Oriented Design)的原則集合,它由五個原則組成,每個原則都代表著一個特定的設計原則,旨在幫助開發人員設計出易於擴展、可維護和可重用的軟件。 這些原則是: 單一職責原則(Single Responsibility Principle,SRP):一個類別應該只有一個職責,即只有一個引起它變化的原因。這樣可以使類別更加聚焦,易於理解、擴展和維護。 開放封閉原則(Open-Closed Principle,OCP):軟件實體(類別、模塊、函數等)應該對擴展是開放的,對修改是封閉的。這意味著當需求變化時,應該通過擴展現有代碼來實現變化,而不是修改現有代碼。 里氏替換原則(Liskov Substitution Principle,LSP):子類別應該能夠替換父類別,而不會影響程序的正確性。這意味著在使用繼承時,子類別應該遵守父類別的契約(即父類別定義的行為和屬性),並且不應該改變父類別的行為。 接口隔離原則(Interface Segregation Principle,ISP):用戶不應該強迫依賴它們不需要使用的接口。這意味著應該根據客戶端的需要,將大的接口拆分為更小的、特定的接口,從而避免不必要的依賴。 依賴反轉原則(Dependency Inversion Principle,DIP):高層模塊不應該依賴於低層模塊,它們都應該依賴於抽象。這意味著應該通過定義抽象接口或基類,讓高層模塊和低層模塊都依賴於這些抽象,從而實現模塊之間的解耦和可替換性。 遵循 S.O.L.I.D 原則可以幫助開發人員設計出高質量、可擴展和易於維護的軟件。

2025年7月23日 · 2 分钟 · 629 字