c# - 从Delphi到C#的方法数据类型转换
问题描述
抱歉,如果有无法理解或重复的问题!PS我不知道德尔福。
我正在用 C# (WinForms) 为用 Delphi 编写的 DLL 编写程序。在 Delphi 中创建了一个程序,我正在将这些代码改编为 C#。但是在某些数据类型的转换上存在误区。该 DLL 处理发送数据的优缺点。这是Delphi中的代码。
interface
uses Windows,System.Classes,System.SysUtils;
type
TaAlignMode=(taLeft,taRight);
TData=Array[0..312] of Byte;
TItem=Array[0..4] of Byte;
TPluData = packed record
HotKey:Longint;
Name: array[0..36] of AnsiChar;
LFCode: Longint;
Code: array[0..10] of AnsiChar;
BarCode: Longint;
UnitPrice: Longint;
WeightUnit: Longint;
Deptment: Longint;
Tare: Double;
ShlefTime: Longint;
PackageType: Longint;
PackageWeight: Double;
Tolerance: Longint;
Message1: Longint;
Message2: Byte;
LabelId: Byte;
Rebate: ShortInt;
Recomdays: Integer;
IsLock: Boolean;
QtyUnit: Integer;
Ice:Double;
end;
TScaleAccount = packed record
UserID: Longint; //
PluName: array[0..36] of AnsiChar;
LFCode: Longint;
UnitPrice: Double;
WeightUnit: Longint;
TotalPrice: Double;
Weight: Double;
SaleTime: TDateTime;
Rebate: Longint;
OnlineTime: TDateTime;
Quantity: Longint;
Clerk: Longint;
// MarkD: string;
end;
发送数据的函数如下
//In Delphi given as
function rtscaleUploadData(Connid:Integer; Data:PAnsiChar; len:Integer; Retdata: PAnsiChar): Integer; stdcall; far; external 'rtslabelscale.dll';
//I converted to C# as following:
[DllImport("rtslabelscale.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int rtscaleUploadData(
int Connid, // Connection ID
string Data, // Data for upload
int len, // Length of uploaded data
string Retdata // return 265byte data without any processing
);
并且有下面的代码单元格到这个函数。
//Delphi Code
procedure TFrmMain.btnUploadDataClick(Sender: TObject);
var
ret:Integer;
Data:TData;
retData:TData;
Str,sRetJson:Ansistring;
iProtocol:Integer;
jo:ISuperObject;
iSendLen:Integer;
i:Integer;
begin
if ConnectScale then
begin
try
SetLength(sRetJson,100);
iProtocol := 0;
if rtscaleGetScaleType(Connid,PAnsiChar(sRetJson),Length(sRetJson))=0 then //��ȡ������
begin
jo := SO(sRetJson);
iProtocol := jo.I['Protocol'];
end;
Data := getUploadTestData(iProtocol);
FillChar(retData,SizeOf(retData),0);
if iProtocol=1 then
iSendLen := 265
else
iSendLen := 261;
ret := rtscaleUploadData(Connid, @Data,iSendLen,@retData); //retData=265byte use 256
finally
rtscaleDisConnect(Connid);
if (ret=0) then
begin
Str:='';
for i:=0 to iSendLen-1 do
begin
Str:=Str+format('%2.2x ',[retData[i]]);
if(i mod 16 =15)then
begin
Str := Str+#13#10;
end;
end;
ShowMessage(Str);
end;
end;
end else
begin
ShowMessage('connect Fail');
exit;
end;
end;
我将此代码转换为 C#,如下所示(我的数据上传部分有问题,这就是为什么我只显示数据上传部分)。
private Boolean DownloadpluByJson1()
{
for (int J = 0; J < 300; J++)
{
var obj = new JArray();
for (int i = 0; i < 4; i++)
{
string s = "pluname" + (J * 4 + i + 1).ToString();
int LFCode = J * 4 + i + 1 + 10000;
Pludata plu = new Pludata
{
Name = s,
LFCode = LFCode,
Code = LFCode.ToString(),
BarCode = 40,
UnitPrice = 1000,
WeightUnit = 4,
Deptment = 4,
Tare = 0,
ShlefTime = 15,
PackageType = 5,
PackageWeight = 3.2f,
Tolerance = 0,
Message1 = 1,
Message2 = 0,
Reserved1 = 0,
Reserved2 = 0,
MultiLabel = 0,
Rebate = 0
};
string sjson = JsonConvert.SerializeObject(plu);
JObject jo = (JObject)JsonConvert.DeserializeObject(sjson);
obj.Add(jo);
}
//MessageBox.Show(obj.ToString());
if (rtsdrv.rtscaleUploadData(DeviceConnection.ConnID, obj.ToString(), obj.Count, "256") != 0)
{
MessageBox.Show("Fail");
return false;
}
else MessageBox.Show("Uploaded");
}
return true;
}
上传秤最多接收 4 条数据,这就是我将所有数据分成 4 条发送的原因。我几乎理解了本节中的所有内容,但有一件事仍不清楚。这里retData: TData;
声明了,但我不明白如何在 C# 中声明和使用这部分。我有两个问题:
- 我是否正确地将 Delphi 函数转换为 C#?
- 如何在已发布的 C# 部分中声明 retData?
解决方案
推荐阅读
- aws-sdk - AWS Pinpoint 中的设备终端节点是唯一的吗?
- javascript - jQuery:使用嵌入在 JavaScript 变量中的 div 作为 jQuery 选择器
- sql - BigQuery 平均时间间隔限制
- php - 在 Wordpress 中的 2 个段落之后插入一个 DIV
- video - FFMPEG:如何创建具有 16:9 纵横比且无拉伸的 webp 预览文件
- node.js - create-react-app 导致 Node.js 请求不通过代理
- java - 尝试在 orientdb 中使用多个线程进行遍历
- python - 列表似乎是一个整数
- excel - Excel VBA:将表数据导出到 Access。如果 2 个字段的主键已经存在,如何覆盖?
- python - 在 matplotlib 中分层轮廓图和表面图