Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的结构包等价物#_C#_Python - Fatal编程技术网

C# C中的结构包等价物#

C# C中的结构包等价物#,c#,python,C#,Python,我正在构建一个C#客户端,它连接到一个渲染应用程序,结果失败了! 我通过剖析一个python客户机来缩小问题的范围,该客户机的工作原理如下: def Startclient_Click(self, sender, e): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, int(port))) mess

我正在构建一个C#客户端,它连接到一个渲染应用程序,结果失败了! 我通过剖析一个python客户机来缩小问题的范围,该客户机的工作原理如下:

   def Startclient_Click(self, sender, e):
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host, int(port)))
            message =  b'message "Render"'
            msg = struct.pack('<l',len(message))+struct.pack('<l',0)+message
            #print(msg)            
            s.sendall(msg)
            data = s.recv(1024)     

            data.decode("utf-8")        
            self.datatxt.Text ="data: " +str(data)
            s.close()

            return
        except:
            self.datatxt.Text ="No Server Connection"
            return
def Startclient\u单击(self、sender、e):
尝试:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 连接((主机,int(端口)))
消息=b'消息“呈现”'
msg=struct.pack(“采用一种格式,后跟一系列将根据格式进行打包的值。在您的问题中,您调用:

struct.pack('<l', len(message))+struct.pack('<l',0)+message
这带来了另一个问题,那就是你无法使用这些工具控制endian的属性。它们暴露了“IsLittleEndian”,所以你知道它们是如何工作的,但你无法改变它

然而,Jon Skeet就在这个例子中——他的库包含一个可以使用的LittleEndianBitConverter(MiscUtil.Conversion.LittleEndianBitConverter)或一个EndianBinaryWriter(如果您使用Writer/MemoryStream)。因此,将所有这些放在一起,参考MiscUtil库并使用类似以下内容:

var bytes = new List<byte[]>(new[]
    {
        LittleEndianBitConverter.GetBytes(message.LongLength), 
        LittleEndianBitConverter.GetBytes(0l), 
        message
    });

var msg = new byte[bytes.Sum(barray => barray.LongLength)];
int offset = 0;
foreach (var bArray in bytes)
{
    System.Buffer.BlockCopy(bArray, 0, msg, offset, bArray.Length);
    offset = bArray.Length;
}
var bytes=新列表(新[]
{
LittleEndianBitConverter.GetBytes(message.LongLength),
LittleEndianBitConverter.GetBytes(0l),
消息
});
var msg=新字节[bytes.Sum(barray=>barray.LongLength)];
整数偏移=0;
foreach(以字节为单位的变量bArray)
{
System.Buffer.BlockCopy(bArray,0,msg,offset,bArray.Length);
偏移量=bArray.长度;
}
代码未经测试,但应该为您提供一个合理的起点。它假设您的消息已经是字节数组,并且msg是您要返回的数组。我们使用System.Buffer.BlockCopy,因为它是原语类型最有效的复制方法

*编辑*

我以问题中的示例为例,在中为及其模拟了一个快速脚本。这里的关键是
Struct.Pack('barray.LongLength)];
整数偏移=0;
foreach(以字节为单位的变量bArray)
{
块复制(bArray,0,msg,offset,bArray.Length);
偏移量=bArray.长度;
}
Console.WriteLine(BitConverter.ToString(msg.Replace)(“-”,“:”);
}
}

第一个参数告诉它哪种打包方式是您最可能遇到的问题…我认为(
“更多参考-感谢您的回复,我一有机会尝试,就会尽快回复您:)我仍然有问题可悲的是,我已经用工作的wpf ironpython版本更新了我的原始帖子,老实说,我认为这将涉及到有人用Thea render测试c#版本,我不希望有人下载一个他们永远不会使用的100meg应用程序。至少在找到answ之前,我有一个python应用程序来做一些原型设计呃:)@NigeC,
(origsize,cmpsize,)=unpack()
var bytes = new List<byte[]>(new[]
    {
        LittleEndianBitConverter.GetBytes(message.LongLength), 
        LittleEndianBitConverter.GetBytes(0l), 
        message
    });

var msg = new byte[bytes.Sum(barray => barray.LongLength)];
int offset = 0;
foreach (var bArray in bytes)
{
    System.Buffer.BlockCopy(bArray, 0, msg, offset, bArray.Length);
    offset = bArray.Length;
}
import struct
message =  b'message "Render"'
msg = struct.pack('<l',len(message)) + struct.pack('<l',0) + message
print(":".join("{0:x}".format(ord(c)) for c in msg))
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MiscUtil.Conversion;

public class Test
{
    public static void Main()
    {
        var message = Encoding.ASCII.GetBytes("message \"Render\"");

            var lenc = new LittleEndianBitConverter();

            var bytes = new List<byte[]>(new[]
            {
                lenc.GetBytes(message.LongLength),
                message
            });

            var msg = new byte[bytes.Sum(barray => barray.LongLength)];
            int offset = 0;
            foreach (var bArray in bytes)
            {
                Buffer.BlockCopy(bArray, 0, msg, offset, bArray.Length);
                offset = bArray.Length;
            }

            Console.WriteLine(BitConverter.ToString(msg).Replace("-", ":"));
    }
}