mirror of
https://github.com/RRQM/TouchSocket.git
synced 2025-12-20 10:26:43 +08:00
在多个 `.mdx` 文件中添加对 `TouchSocketCoreDefinition`、`TouchSocketHttpDefinition`、`TouchSocketDmtpDefinition`、`TouchSocketModbusDefinition`、`TouchSocketProModbusDefinition`、`TouchSocketNamedPipeDefinition`、`TouchSocketWebApiDefinition`、`TouchSocketJsonRpcDefinition` 和 `TouchSocketXmlRpcDefinition` 的导入。增加解析和处理定义部分的 JavaScript 脚本,确保导入的有效性和一致性。新增功能包括精确匹配定义部分的正则表达式、解析定义内容的函数、生成定义组件的函数、递归查找 `.mdx` 文件的功能,以及验证导入的有效性
140 lines
3.3 KiB
Plaintext
140 lines
3.3 KiB
Plaintext
---
|
||
id: othercore
|
||
title: 其他相关功能类
|
||
---
|
||
|
||
import { TouchSocketCoreDefinition } from "@site/src/components/Definition.js";
|
||
|
||
### 定义
|
||
|
||
<TouchSocketCoreDefinition />
|
||
|
||
|
||
## 一、Crc计算
|
||
**TouchSocket**从网上搜集了Crc1-23的计算方法。并封装在了Crc类中。
|
||
以最常用的Crc16为例。
|
||
```csharp showLineNumbers
|
||
byte[] data = new byte[10];
|
||
byte[] result = Crc.Crc16(data, 0, data.Length);
|
||
```
|
||
|
||
## 二、时间测量器(TimeMeasurer)
|
||
功能:封装的Stopwatch,测量运行Action的时间。
|
||
```csharp showLineNumbers
|
||
TimeSpan timeSpan = TimeMeasurer.Run(() =>
|
||
{
|
||
Thread.Sleep(1000);
|
||
});
|
||
|
||
```
|
||
|
||
## 三、MD5计算
|
||
```csharp showLineNumbers
|
||
string str = MD5.GetMD5Hash("TouchSocket");
|
||
bool b = MD5.VerifyMD5Hash("TouchSocket",str);
|
||
```
|
||
|
||
## 四、16进制相关
|
||
|
||
【将16进制的字符转换为数组】
|
||
```csharp showLineNumbers
|
||
public static byte[] ByHexStringToBytes(this string hexString, string splite = default)
|
||
```
|
||
【将16进制的字符转换为int32】
|
||
```csharp showLineNumbers
|
||
public static int ByHexStringToInt32(this string hexString)
|
||
```
|
||
|
||
## 五、雪花Id生成
|
||
|
||
雪花Id,会生成long类型的不重复Id。
|
||
```csharp showLineNumbers
|
||
SnowflakeIDGenerator generator = new SnowflakeIDGenerator(4);
|
||
long id=generator.NextID();
|
||
```
|
||
|
||
## 六、数据压缩
|
||
内部封装了Gzip的压缩。使用静态方法即可完成。
|
||
```csharp showLineNumbers
|
||
|
||
byte[] data = new byte[1024];
|
||
new Random().NextBytes(data);
|
||
|
||
using (ByteBlock byteBlock=new ByteBlock(1024*64))
|
||
{
|
||
GZip.Compress(byteBlock,data,0,data.Length);//压缩
|
||
var decompressData2 = GZip.Decompress(byteBlock.ToArray());//解压
|
||
}
|
||
|
||
|
||
```
|
||
|
||
压缩接口
|
||
内部还定义了一个IDataCompressor的压缩接口。目的是为了向成熟框架传递压缩方法(例如TcpClient)。
|
||
默认配备了一个GZipDataCompressor。可以直接使用。当然大家可以自由扩展其他压缩方法。
|
||
|
||
```csharp showLineNumbers
|
||
class MyDataCompressor : IDataCompressor
|
||
{
|
||
public byte[] Compress(ArraySegment<byte> data)
|
||
{
|
||
//此处实现压缩
|
||
throw new NotImplementedException();
|
||
}
|
||
|
||
public byte[] Decompress(ArraySegment<byte> data)
|
||
{
|
||
//此处实现压缩
|
||
throw new NotImplementedException();
|
||
}
|
||
}
|
||
```
|
||
|
||
## 七、短时间戳
|
||
|
||
一般的,时间可由long类型作为唯一时间戳,但是有时候,我们也需要短类型的时间戳(uint),所以您可以使用**DateTimeExtensions**类实现,或者使用其扩展方法。
|
||
|
||
```csharp showLineNumbers
|
||
uint timestamp= DateTimeExtensions.ConvertTime(DateTime.Now);
|
||
timestamp= DateTime.Now.ConvertTime();//扩展方法
|
||
```
|
||
|
||
## 八、读写锁using
|
||
|
||
一般的,我们都会使用**ReaderWriterLockSlim**读写锁,进行成对的Enter和Exit。所以我们一般会使用下列代码。
|
||
|
||
```csharp showLineNumbers
|
||
ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
|
||
try
|
||
{
|
||
lockSlim.EnterReadLock();
|
||
//do something
|
||
}
|
||
finally
|
||
{
|
||
lockSlim.ExitReadLock();
|
||
}
|
||
```
|
||
|
||
但是会显得代码非常臃肿。所以我们可以简化使用using实现。
|
||
|
||
```csharp showLineNumbers
|
||
ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
|
||
|
||
using (new ReadLock(lockSlim))
|
||
{
|
||
//do something
|
||
}
|
||
|
||
using (new WriteLock(lockSlim))
|
||
{
|
||
//do something
|
||
}
|
||
```
|
||
|
||
:::tip 提示
|
||
|
||
**ReadLock**和**WriteLock**均为struct类型,所以几乎不会影响性能。
|
||
|
||
:::
|