Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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# Delphi记录到C结构的转换和对套接字的写入_C#_Delphi_Pinvoke - Fatal编程技术网

C# Delphi记录到C结构的转换和对套接字的写入

C# Delphi记录到C结构的转换和对套接字的写入,c#,delphi,pinvoke,C#,Delphi,Pinvoke,我有以下Delphi代码: type RegbusReq2=packed record Funct:char; Device:char; Device1:char; Starting:integer; Quantity:smallint; _CRC:Word; //CRC stroka:char;

我有以下Delphi代码:

type
   RegbusReq2=packed record 
     Funct:char;             
     Device:char;           
     Device1:char;
     Starting:integer;       
     Quantity:smallint;      
     _CRC:Word;              //CRC
     stroka:char;          
   end;

   type                         
     crcReg=packed record
     buf:array[0..2] of byte;
     value:array[0..5] of byte;
   end;

   type                          
   myRB=record                      
   case byte of
    0:(data:RegbusReq2);
    1:(Buff:crcReg);
   end;
...
procedure TForm1.Button3Click(Sender: TObject);
var
  DataReq:myRB;
  Output:array[1..15] of Byte;
  i:integer;
  nomP:string;
  st:string;
begin
cs1.Address:=edit5.Text;  
 cs1.Port := 6001;
typecon:=2;

DataReq.data.Funct:=chr(63);    
DataReq.data.Device:=chr(48);     
DataReq.data.Device1:=chr(49);    
DataReq.data.Starting:=768;     
DataReq.data.Quantity:=7;      
DataReq.data._CRC:=CRC2(@DataReq.Buff.value,6);      
  memo1.Lines.Add(IntToStr(DataReq.data._CRC));
DataReq.data.stroka:=chr(13);             
application.ProcessMessages();
  cs1.Active:=true;
  cs1.Socket.SendBuf(DataReq.data,SizeOf(DataReq.data));
  application.ProcessMessages();
  cs1.Socket.ReceiveBuf(output,SizeOf(output));         
  application.ProcessMessages();
  cs1.Active:=false;
  application.ProcessMessages();

if output[1]<>62 then begin
  showmessage('îøèáêà ñâÿçè');
  exit;
end;
  for i:=10 to 15 do
  begin
    nomp:= nomp + chr(Output[i]);
    st:=st + '_' + inttostr(output[i]);
  end;
  memo1.Lines.Add(inttostr(sizeof(DataReq.data)));
  memo1.Lines.Add(st);
  memo1.Lines.Add(DataReq.data.Funct);
  form1.Caption:=nomp;
  Button1.Enabled:=true;
end;
我尝试用代码将srtuct转换为字节数组:

public static byte[] Serialize(object obj)
        {
            Type objectType = obj.GetType();
            int objectSize = Marshal.SizeOf(obj);
            IntPtr buffer = Marshal.AllocHGlobal(objectSize);
            Marshal.StructureToPtr(obj, buffer, false);
            byte[] array = new byte[objectSize];
            Marshal.Copy(buffer, array, 0, objectSize);
            Marshal.FreeHGlobal(buffer);
            return array;
        }
并发送:

System.Net.Sockets.TcpClient cl = new System.Net.Sockets.TcpClient();
            cl.Connect(IPAddress.Parse("xxx.xxx.xxx.xxx"), 6001);
if (cl.Connected)
            {
RegBusRec req2 = new RegBusRec();
                req2.Funct = '?';
                req2.Device = '0';
                req2.Device = '1';
                req2.Starting = 768;
                req2.Quantity = 7;
                req2.Message = '\r';
byte[] data = Serialize(req2);
cl.Client.Send(data);
                cl.Client.Receive(output);
if (output[0] != 62)
                {
                    Console.WriteLine("Connection error!");
                    Console.ReadLine();
                }
}

但我从设备上收到了错误的信息。需要将Delphi代码转换为C。请提前感谢。

您的结构错误。应该是:

[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
struct RegBusRec
{
    public char Funct;
    public char Device;
    public char Device1;
    public int Starting;
    public short Quantity;
    public ushort _CRC;
    public char Message;
}
Delphi整数与C int匹配。Delphi Smallint与C short匹配。Delphi Word与C ushort匹配

你对显式布局的使用只会让你的生活变得艰难。使用sequential和Pack属性简化事务

在初始化结构的代码中,要编写:

req2.Device = '0';
req2.Device = '1';
我想你是想写信

req2.Device = '0';
req2.Device1 = '1';

我没有检查任何其他内容,可能还有其他我没有发现的错误。如果我是你,我会添加诊断代码,以逐字节发送序列化结构,这样你就可以确保序列化正确。

你的结构是错误的。应该是:

[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
struct RegBusRec
{
    public char Funct;
    public char Device;
    public char Device1;
    public int Starting;
    public short Quantity;
    public ushort _CRC;
    public char Message;
}
Delphi整数与C int匹配。Delphi Smallint与C short匹配。Delphi Word与C ushort匹配

你对显式布局的使用只会让你的生活变得艰难。使用sequential和Pack属性简化事务

在初始化结构的代码中,要编写:

req2.Device = '0';
req2.Device = '1';
我想你是想写信

req2.Device = '0';
req2.Device1 = '1';

我没有检查任何其他内容,可能还有其他我没有发现的错误。如果我是你,我会添加诊断代码,以逐字节发送序列化结构,这样你就可以确保序列化正确。

谢谢David!我相信他已经纠正了设备的结构和价值1。现在我需要转换CRC计算function@Superjet100这个网站上的惯例是一次一个问题。我回答了你的问题。如果你想问另一个问题,请为此提出一个新问题。我把问题恢复到原来的形式。我问了另一个问题谢谢大卫!我相信他已经纠正了设备的结构和价值1。现在我需要转换CRC计算function@Superjet100这个网站上的惯例是一次一个问题。我回答了你的问题。如果你想问另一个问题,请为此提出一个新问题。我把问题恢复到原来的形式,又问了一个问题