Вызов RPG программы с VB.NET и cwbx stringconverter - PullRequest
0 голосов
/ 25 февраля 2011

У нас на 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-й байт равен нулю.Это [Нуль].
Поэтому вместо того, чтобы видеть что-то вроде: # ^! @ 7 '<"& $ # T ~ * (<br> Я вместо этого вижу: # ^! @ Потому что 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 ]

1 голос
/ 20 октября 2011

Если вы хотите использовать символы EBCIDIC для каждого байта, используйте кодировку IBM037.В C #:

Encoding ibm037 = Encoding.GetEncoding("IBM037");
string Str = ibm037.GetString(byteArr);
0 голосов
/ 25 февраля 2011

Do not конвертирует байт [] в строку с помощью конвертера строк EBCDIC.Хотя 0 является вполне приемлемым байтовым значением, оно часто действует как ограничитель строки.Он делает это для отладчика (обратите внимание на отсутствующую завершающую двойную кавычку), что, скорее всего, не так хорошо для вашего провайдера dbase.Если вы не хотите хранить значение в виде двоичного двоичного объекта в базе данных, закодируйте его с помощью Convert.ToBase64String ().Прочитайте его обратно с помощью Convert.FromBase64String ().

...