用VB.NET和cwbx stringconverter调用RPG程序

时间:2011-02-25 19:21:31

标签: vb.net ascii byte ibm-midrange

我们的AS400上有一个程序,它接收一个数字,加密它然后再传递加密的字符。使用CWBX stringConverter.FromBytes方法...我能够将数字字节/ ascii代码值转换为适当的字符。这已经很好了一段时间,直到我们注意到一些值被切断了。

返回的字节数组如下所示: (70,126,135,27,0,201,222,229,52,75,61,121,34,65,113,215)

其中240 =“0”,241 =“1”,64 = [空格]等......问题在于第5个字节等于零。这是[Null] 因此,而不是看到类似的东西:#^!@ 7'<“& $#T~ *(
我反而看到了:#^!@ 因为第5个字符元素是[Null],所以它基本上会切断该字符以及字符串的其余部分!

通常,我只检查字节元素= 0,然后执行其他操作。唯一的问题是,我必须将这些数据插入到数据库中,以便以后可以对其进行解密,因此我无法更改角色并将其更改为“#”字符。

我已尝试循环遍历每个值,如果字节等于零,则将vbNull附加到字符串上,但是当它解密时它不会返回相同的字节ascii代码“0”,它返回为“241” “这是vbNull。

这是我目前的代码:

Dim as400 As cwbx.AS400System
as400 = New cwbx.AS400SystemClass()
Dim program As cwbx.Program = New cwbx.Program()
Dim strResult(1) As String

as400.Define(RPGServer)
program.system = as400
program.system.UserID = RPGUsername
program.system.Password = RPGPassword
program.LibraryName = CurrentLibrary
program.ProgramName = EncryptionProgram

If as400.IsConnected(cwbx.cwbcoServiceEnum.cwbcoServiceRemoteCmd) = 0 Then
    as400.Disconnect(cwbx.cwbcoServiceEnum.cwbcoServiceAll)
    as400.Connect(cwbx.cwbcoServiceEnum.cwbcoServiceRemoteCmd)
End If

Dim stringConverter As cwbx.StringConverter = New cwbx.StringConverterClass()
Dim parameters As cwbx.ProgramParameters = New cwbx.ProgramParametersClass()

stringConverter.Length = 16

parameters.Append("&INNUM", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 16)
parameters("&INNUM").Value = stringConverter.ToBytes(CardNo.PadRight(16, " "))

parameters.Append("&OUTNUM", cwbx.cwbrcParameterTypeEnum.cwbrcOutput, 16)

program.Call(parameters)

strResult(0) = stringConverter.FromBytes(parameters("&OUTNUM").Value)

以下是我尝试更改角色的原因:

stringConverter.Length = 16
Dim byteArr() As Byte = {22, 11, 57, 27, 0, 221, 252, 143, 52, 54, 66, 72, 31, 65, 24, 77}

Dim strValue As String = ""
For Each b As Byte In byteArr
    stringConverter.Length = 1
    If b = 0 Then
        strValue &= vbNull
    Else
        Dim tbb2() As Byte = {b}
        strValue &= stringConverter.FromBytes(tbb2)
    End If
Next
stringConverter.Length = 16

Dim tttt As Byte() = stringConverter.ToBytes(strValue)

2 个答案:

答案 0 :(得分:1)

如果要为每个字节使用EBCDIC字符,请使用IBM037编码。 在C#中:

Encoding ibm037 = Encoding.GetEncoding("IBM037");
string Str = ibm037.GetString(byteArr);

答案 1 :(得分:0)

将byte []转换为带有EBCDIC字符串转换器的字符串。虽然0是一个非常合理的字节值,但它通常充当字符串终止符。它为调试器执行此操作(请注意缺少尾随双引号),对于您的dbase提供程序也不太可能这样做。如果您不想将值存储为dbase中的二进制blob,则使用Convert.ToBase64String()对其进行编码。用Convert.FromBase64String()读回来。