【发布时间】:2021-05-02 03:56:07
【问题描述】:
我正在创建自己的 DNS 服务器和主机拦截器,我想从 DNS 请求消息 byte[] 中获取主机
dns 消息十六进制转储:
e07901000001000000000000057961686f6f03636f6d0000010001
.y...........yahoo.com.....
代码:
using System;
using System.Text;
public class Program
{
public static void Main()
{
string b64 = "4HkBAAABAAAAAAAABXlhaG9vA2NvbQAAAQAB";
int pad = b64.Length % 4;
if (pad > 0 )
{
b64 += new string('=', 4 - pad);
}
byte[] decoded = Convert.FromBase64String(b64);
int start = 13;
int end = start;
while(decoded[end] != 0){
end++;
}
int hostLength = end-start;
byte[] byteHost = new byte[hostLength];
Array.Copy(decoded, start, byteHost, 0, hostLength);
string host = Encoding.Default.GetString(byteHost);
Console.WriteLine(host); // yahoo♥com
}
}
问题:
- 我上面的方法是正确/高效/最快地获取主机名吗?
- 为什么我得到奇怪的字符替换点
yahoo♥com?
更改为 Encoding.ASCII 或 Encoding.UTF8 无效
【问题讨论】:
-
供参考:编写 DNS 服务器作为学术练习可能会很有趣,但我不会为“真实事物”这样做 - 只是得到一个 pi-hole;它具有内置的自定义主机阻塞等
-
学习用的????
-
使用它是否符合您的目标并提供预期的结果:
new string(decoded.Select(b => (char)b).Where(char.IsLetterOrDigit).ToArray())?你可以用任何逻辑替换IsLetterOrDigit。 -
@OlivierRogier 它将删除点。
-
@uingtea 您的代码输出
yahoo♥com和sn-pàyyahoocom。你实际上期望什么?yahoo.com?