我们的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)
答案 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()读回来。