C# 如何用空字符填充字节头?

C# 如何用空字符填充字节头?,c#,winforms,sockets,C#,Winforms,Sockets,我目前正在尝试向字节数组添加其他字节 我正在尝试向包含计算机名的服务器发送标头。然而,因为每台机器的计算机名都可能发生变化,所以我试图创建一个字节数组,该数组的特定长度类似于100字节 这意味着一旦我有了我的字符串头“rdmstream§”+Dns.GetHostName(),我需要在末尾或开头添加x个字节作为填充,以便总字节长度=100 我想知道这是否可能 下面是我设置标题长度的代码示例: public static void SendMultiScreen(byte[] img)

我目前正在尝试向字节数组添加其他字节

我正在尝试向包含计算机名的服务器发送标头。然而,因为每台机器的计算机名都可能发生变化,所以我试图创建一个字节数组,该数组的特定长度类似于100字节

这意味着一旦我有了我的字符串头“rdmstream§”+Dns.GetHostName(),我需要在末尾或开头添加x个字节作为填充,以便总字节长度=100

我想知道这是否可能

下面是我设置标题长度的代码示例:

 public static void SendMultiScreen(byte[] img)
    {
        try
        {

            //string command = ("rdmstream§" + Dns.GetHostName()); //This is what I want to add.

            byte[] send = new byte[img.Length + 16]; //Create a new buffer to send to the server
            byte[] header = Encoding.Unicode.GetBytes("rdmstrea"); //Get the bytes of the header
            Buffer.BlockCopy(header, 0, send, 0, header.Length); //Copy the header to the main buffer
            fps = 800;
            Buffer.BlockCopy(img, 0, send, header.Length, img.Length); //Copy the image to the main buffer
            _clientSocket.Send(send, 0, send.Length, SocketFlags.None); //Send the image to the server


        }
正如您所看到的,只要消息只有8个字符长,这就可以了。但是我希望消息中的字符是可变的

如果我诚实的话,我没有太多关于字节的知识,所以任何额外的帮助都将不胜感激


提前谢谢。

如果填充是正确的方法,人们可能会争论这个问题,但是你可以填充主人的名字

string hostName = "OhWhatEver".PadRight(100)
然后将其用作GetBytes调用的输入

编辑: 如果您无法使用这些空间,请使用:

byte[] header = new byte[100];
byte[] hostname = System.Text.Encoding.Unicode.GetBytes("rdmstream§" + System.Net.Dns.GetHostName());
Array.Copy(hostname, header, hostname.Length);

如果填充是正确的方式,人们可能会对此争论,但您可以填充主机名

string hostName = "OhWhatEver".PadRight(100)
然后将其用作GetBytes调用的输入

编辑: 如果您无法使用这些空间,请使用:

byte[] header = new byte[100];
byte[] hostname = System.Text.Encoding.Unicode.GetBytes("rdmstream§" + System.Net.Dns.GetHostName());
Array.Copy(hostname, header, hostname.Length);

如果您关心的是数据包碎片:
Socket
具有重载,可以在单个操作中发送缓冲区段列表。这意味着您可以执行以下操作:

var segments = new List<ArraySegment<byte>>();
segments.Add(header);
segments.Add(img);
var段=新列表();
段。添加(标题);
段。添加(img);
请注意,标头不必是完整数组;您可以发送数组的一部分,这样可以重复使用相同的缓冲区;例如:

byte[] buffer = new byte[MaxLength];
var segments = new List<ArraySegment<byte>>();
segments.Add(default); // placeholder
segments.Add(img);
foreach(...) {
    string val = ...
    int len = encoding.GetBytes(val, 0, val.Length, buffer, 0);
    segments[0] = new ArraySegment<byte>(buffer, 0, len);
    thisSocket.Send(segments);
}
byte[]buffer=新字节[MaxLength];
var segments=新列表();
segments.Add(默认);//占位符
段。添加(img);
foreach(…){
字符串val=。。。
int len=encoding.GetBytes(val,0,val.Length,buffer,0);
段[0]=新数组段(缓冲区,0,len);
thisSocket.Send(段);
}
然而,要做到这一点,通常需要在报头上进行某种帧处理——要么是哨兵值(可能是尾随的CR/LF/CRLF),要么是字符串的字节数前缀—
len



如果这真的不可能……只需循环数组中未使用的部分并将其设置为所需的值,或者使用
数组。如果零可以,则清除

如果您担心的是数据包碎片:
套接字具有重载,可以在单个操作中发送缓冲区段列表。这意味着您可以执行以下操作:

var segments = new List<ArraySegment<byte>>();
segments.Add(header);
segments.Add(img);
var段=新列表();
段。添加(标题);
段。添加(img);
请注意,标头不必是完整数组;您可以发送数组的一部分,这样可以重复使用相同的缓冲区;例如:

byte[] buffer = new byte[MaxLength];
var segments = new List<ArraySegment<byte>>();
segments.Add(default); // placeholder
segments.Add(img);
foreach(...) {
    string val = ...
    int len = encoding.GetBytes(val, 0, val.Length, buffer, 0);
    segments[0] = new ArraySegment<byte>(buffer, 0, len);
    thisSocket.Send(segments);
}
byte[]buffer=新字节[MaxLength];
var segments=新列表();
segments.Add(默认);//占位符
段。添加(img);
foreach(…){
字符串val=。。。
int len=encoding.GetBytes(val,0,val.Length,buffer,0);
段[0]=新数组段(缓冲区,0,len);
thisSocket.Send(段);
}
然而,要做到这一点,通常需要在报头上进行某种帧处理——要么是哨兵值(可能是尾随的CR/LF/CRLF),要么是字符串的字节数前缀—
len



如果这真的不可能…只需循环数组中未使用的部分并将其设置为所需的值,或者使用
数组。如果零可以,则清除

填充似乎非常浪费,为什么不使用表示长度的单个字节作为数据前缀或以常量序列终止数据。计算大小是否有问题?请尝试使用d乘法。或者是用字节填充分配的字节数组的问题?用零填充?然后可以清除它(用
0
填充)在复制到它之前。@AlexK.im对socket编程非常陌生。我在网上找到了这个示例,但它只适用于设置值。我不确定如何为数据添加前缀。@Sinatr很好地计算大小是一个问题,我试图为一所学校制作一个监控应用程序,以便能够监控学生的计算机。因此,每台计算机都将有一个不同的DNS.Hostname。我需要能够识别学生的每个屏幕共享图像,因此我认为将其添加到标题中是正确的选择。填充似乎非常浪费,为什么不在数据前面加一个表示长度的字节,或者用一个常量序列终止它。计算大小有问题吗?尝试使用和乘法。或者是用字节填充分配的字节数组的问题?用零填充?然后可以清除它(用
0
填充)在复制到它之前。@AlexK.im对socket编程非常陌生。我在网上找到了这个示例,但它只适用于设置值。我不确定如何为数据添加前缀。@Sinatr很好地计算大小是一个问题,我试图为一所学校制作一个监控应用程序,以便能够监控学生的计算机。因此,每台计算机都将有一个不同的DNS.Hostname。我需要能够识别学生的每个屏幕共享图像,所以我认为将其添加到标题中是正确的选择。我会尝试一下。填充似乎是目前对我来说最简单的方法。编辑在我的客户端上起作用,只需要让我的服务器检查第100个字节。感谢@toAtworkAll钩子的帮助我在服务器上玩得很好,为了学习这个,我的大脑已经震动了好长时间了!非常感谢你的帮助。谢谢!我会尝试一下。填充似乎是目前对我来说最简单的方法。编辑在我的客户端上起作用了,只需要让我的服务器检查第100个字节。谢谢你的帮助@toAtworkAll连接到服务器上很好,为了学习这一点,我已经绞尽脑汁很久了!非常感谢你的帮助。谢谢!碎片不是我关心的问题,我正在尝试创建一个屏幕共享应用程序来监控