Проблема кодирования файла, созданного программой Java для приложения VB - PullRequest
1 голос
/ 23 мая 2019

У меня есть крошечная программа Java Encryption, которая читает csv и генерирует зашифрованный файл csv для загрузки в приложение VB, но приложение VB после расшифровки не может правильно отображать символы.

Я открыл файл в Notepad ++ и преобразовал его в UTF-8 в notepad ++, и приложение VB смогло расшифровать и отобразить все нужные символы.Затем я продолжил и изменил свой код для чтения в строках из CSV с использованием UTF-8, но я не работал.Я попытался прочитать файл, преобразовав его в байты и создав новую строку, используя кодировку UTF-8, но это тоже не сработало.Почему это работает, когда я использую notepad ++ для преобразования в UTF-8, а не когда я пытаюсь сделать это в своем коде.

Функция VB

//each line from the encrypted file is processed by this VB RC4 function
Private Function RC4(ByVal Str As String, ByVal Pwd As String) As String

    Dim strReturnValue As String = ""
    Dim Sbox(0 To 255) As Integer
    Dim A, B, c
    Dim Key() As Byte, ByteArray() As Byte, Tmp As Byte

    If Len(Pwd) = 0 Or Len(Str) = 0 Then GoTo Exit_Function
    If Len(Pwd) > 256 Then
      Key = System.Text.Encoding.Default.GetBytes(Microsoft.VisualBasic.Left(Pwd, 256)) ''StrConv(Left$(Pwd, 256), vbFromUnicode)
    Else
      Key = System.Text.Encoding.Default.GetBytes(Pwd)  ''StrConv(Pwd, vbFromUnicode)
    End If

    For A = 0 To 255
      Sbox(A) = A
    Next A
    A = 0 : B = 0 : c = 0
    For A = 0 To 255
      B = (B + Sbox(A) + Key(A Mod Len(Pwd))) Mod 256
      Tmp = Sbox(A)
      Sbox(A) = Sbox(B)
      Sbox(B) = Tmp
    Next A
    A = 0 : B = 0 : c = 0
    ByteArray = System.Text.Encoding.Default.GetBytes(Str) '' StrConv(Str, vbFromUnicode)
    For A = 0 To Len(Str) - 1
      B = (B + 1) Mod 256
      c = (c + Sbox(B)) Mod 256
      Tmp = Sbox(B)
      Sbox(B) = Sbox(c)
      Sbox(c) = Tmp
      ByteArray(A) = ByteArray(A) Xor (Sbox((Sbox(B) + Sbox(c)) Mod 256))
    Next A
    strReturnValue = System.Text.Encoding.Default.GetString(ByteArray)  ''StrConv(ByteArray, vbUnicode)
Exit_Function:
    Return strReturnValue
  End Function

Java

//processing line from the input file and writing to file
try
 {
FileOutputStream fos = newFileOutputStream("stackOverFlow\\EncryptedFile.csv",true);
byte [] encrypt = EncryptFile.RC4(line.getBytes(), pwd);
fos.write(encrypt);
fos.close();
}
catch (Exception e1) 
{
e1.printStackTrace();
}

1 Ответ

0 голосов
/ 26 мая 2019

После декомпиляции приложения VB и прочтения поста ниже я нашел решение:

Чтение файла построчно с VB.NET

Я изменил способобъявление Reader от

Dim Reader As StreamReader

до

Dim Reader As New StreamReader (filetoimport.Text, Encoding.Default)

...