-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCameraEventId.cs
More file actions
59 lines (51 loc) · 2.15 KB
/
Copy pathCameraEventId.cs
File metadata and controls
59 lines (51 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Buffers.Binary;
using System.Security.Cryptography;
using System.Text;
namespace OpenCamInterop;
public static class CameraEventId
{
public static string FromPayload(string adapterName, ReadOnlySpan<byte> payload)
{
if (string.IsNullOrWhiteSpace(adapterName))
throw new ArgumentException("An adapter name is required.", nameof(adapterName));
var normalizedName = NormalizeAdapterName(adapterName);
var hash = SHA256.HashData(payload);
return $"{normalizedName}-{Convert.ToHexString(hash).ToLowerInvariant()}";
}
public static string FromAdapterMessage(
string adapterName,
string channel,
ReadOnlySpan<byte> payload)
{
if (string.IsNullOrWhiteSpace(adapterName))
throw new ArgumentException("An adapter name is required.", nameof(adapterName));
ArgumentNullException.ThrowIfNull(channel);
var normalizedName = NormalizeAdapterName(adapterName);
using var hash = IncrementalHash.CreateHash(HashAlgorithmName.SHA256);
AppendField(hash, Encoding.UTF8.GetBytes(adapterName));
AppendField(hash, Encoding.UTF8.GetBytes(channel));
AppendField(hash, payload);
return $"{normalizedName}-{Convert.ToHexString(hash.GetHashAndReset()).ToLowerInvariant()}";
}
public static string FromText(string adapterName, string value)
{
ArgumentNullException.ThrowIfNull(value);
return FromPayload(adapterName, Encoding.UTF8.GetBytes(value));
}
private static string NormalizeAdapterName(string adapterName)
{
var normalized = new string(adapterName
.Trim()
.ToLowerInvariant()
.Select(character => char.IsAsciiLetterOrDigit(character) ? character : '-')
.ToArray());
return normalized.Trim('-') is { Length: > 0 } result ? result : "event";
}
private static void AppendField(IncrementalHash hash, ReadOnlySpan<byte> value)
{
Span<byte> length = stackalloc byte[sizeof(int)];
BinaryPrimitives.WriteInt32BigEndian(length, value.Length);
hash.AppendData(length);
hash.AppendData(value);
}
}