我有一个VB.net项目,我已经转换为C#。代码的一部分在C#中提供的结果与在VB.Net中的结果不同。有人能告诉我这里的C#代码有什么问题以及如何修复它?
VB.Net:
Private Sub mco_GetDataReturn(ByVal TransactionNumber As Short, ByVal DataType As ModiconComunications.ModiconComObject.GetDataType, ByVal Success As Boolean, ByVal UserData() As Byte) Handles mco.GetDataReturn
OrderNumber = ""
HeatNumber = ""
If UserData.GetUpperBound(0) < 17 Then
'MsgBox("ModComm1_GetDataReturn - Not enough data returned from PLC read : " & UBound(UserData, 1) + 1 & " bytes")
ReDim Preserve UserData(0 To 17)
ElseIf UserData.GetUpperBound(0) > 17 Then
'MsgBox("ModComm1_GetDataReturn - Too much data returned from PLC read : " & UBound(UserData, 1) + 1 & " bytes")
ReDim Preserve UserData(0 To 17)
End If
OrderNumber = System.Text.Encoding.ASCII.GetChars(UserData, 0, 8)
OrderRelease = System.Text.Encoding.ASCII.GetChars(UserData, 8, 2)
HeatNumber = System.Text.Encoding.ASCII.GetChars(UserData, 10, 6)
PieceNumber = UserData(16) * 256 + UserData(17)
End Sub
C#:
private void mco_GetDataReturn(short TransactionNumber, ModiconComunications.ModiconComObject.GetDataType DataType, bool Success, byte[] UserData)
{
OrderNumber = "";
HeatNumber = "";
if (UserData.GetUpperBound(0) < 17)
{
Array.Resize(ref UserData, 18);
}
else if (UserData.GetUpperBound(0) > 17)
{
Array.Resize(ref UserData, 18);
}
OrderNumber = System.Text.Encoding.ASCII.GetString(UserData, 0, 8).ToString();
OrderRelease = System.Text.Encoding.ASCII.GetString(UserData, 8, 2).ToString();
HeatNumber = System.Text.Encoding.ASCII.GetString(UserData, 10, 6).ToString();
PieceNumber = UserData[16] * 256 + UserData[17];
}
具体问题在于PieceNumber的最后一个语句。在VB.Net中,语句产生实际的片段号,但是在C#代码中它产生0(零)。这些陈述有何不同?在两个项目中,PieceNumber变量都被声明为int。
答案 0 :(得分:2)
在VB.net中,当你使用new Array(10)创建一个数组时,你指出它的上限是10,因此它包含11个元素。
在C#中,new Array(10)将创建一个包含10个元素的数组(从0到9)。 我想这是你问题的根源。
答案 1 :(得分:0)
是否取决于UserData
的初始内容?你确定用相同的参数调用它吗?
如果它是10个字节长,并且你将它调整为18个字节,那么'new'值将为零。
因此UserData[16] * 256 + UserData[17]
== 0 * 256 + 0
= 0
此外,在VB中你有
OrderNumber = System.Text.Encoding.ASCII.GetChars(UserData, 0, 8)
在C#中你有
OrderNumber = System.Text.Encoding.ASCII.GetString(UserData, 0, 8).ToString();
您还可以为其他两个字符串执行此操作吗?如果它是一个简单的重写,为什么会有区别?
答案 2 :(得分:0)
以下代码(在LinQPad中)按预期工作。给我们一些样本数据进行调查。
var testData = new Dictionary<string, int> {
{ "01234567890123", 0 },
{ "012345678901234", 0 },
{ "0123456789012345", 0 },
{ "01234567890123456", 13824 },
{ "012345678901234567", 13879 },
{ "0123456789012345678", 13879 },
{ "01234567890123456789", 13879 },
{ "012345678901234567890", 13879 }
};
foreach (var pair in testData){
var testCase = pair.Key;
var expected = pair.Value;
var UserData = System.Text.Encoding.ASCII.GetBytes(testCase);
if (UserData.GetUpperBound(0) < 17)
{
Array.Resize(ref UserData, 18);
}
else if (UserData.GetUpperBound(0) > 17)
{
Array.Resize(ref UserData, 18);
}
var OrderNumber = System.Text.Encoding.ASCII.GetString(UserData, 0, 8).ToString();
var OrderRelease = System.Text.Encoding.ASCII.GetString(UserData, 8, 2).ToString();
var HeatNumber = System.Text.Encoding.ASCII.GetString(UserData, 10, 6).ToString();
var PieceNumber = UserData[16] * 256 + UserData[17];
(new {
TestCase = testCase,
OrderNumber,
OrderRelease,
HeatNumber,
PieceNumber,
Success = PieceNumber == expected
}).Dump();
}