我正在将旧的VB.net项目转换为Java(我几乎不知道任何VB)。
Dim asciis As Byte() = System.Text.Encoding.ASCII.GetBytes(name)
For i As Int32 = 0 To asciis.Length - 1
asciis(i) = CByte(asciis(i) + 1)
Next
Dim encryptedName As String = StrReverse(Uri.EscapeDataString(System.Text.Encoding.ASCII.GetString(asciis, 0, asciis.Count())))
我将其转换为:
byte[] asciis = name.getBytes();
for (int i =0; i<asciis.length-1;i++){
asciis[i] = (byte)(asciis[i]+1);
}
String encryptedName = StringUtils.reverse(asciis.toString()).substring(0,asciis.length);
我转换了name
29384
,而.Net提供了594A3%3
,而我的Java代码则提供了d9354
。
我错过了什么?
答案 0 :(得分:1)
此asciis.toString()
不正确(它会为您提供数组的地址),您需要执行new String(asciis, StandardCharsets.UTF_8)
从字节数组创建字符串。并且您需要应用URLEncoder.encode(newString, StandardCharsets.UTF_8.name())
来应用在VB代码中完成的相同URI编码。此外,您需要name.getBytes(StandardCharsets.UTF_8)
而不是name.getBytes()
,因为否则您将使用其运行的操作系统的默认字符集,并且它可能不兼容ASCII。
答案 1 :(得分:0)
好吧,因为@Nyamiou说我必须将字符串赋予字符串并使用URLEncoder对其进行编码。
byte[] asciis = number.getBytes(Charset.forName("US-ASCII"));
for (int i =0; i<asciis.length;i++){
asciis[i] = (byte)(asciis[i]+1);
}
String asciiString = new String(asciis, Charset.forName("US-ASCII"));
String encryptedNumber= StringUtils.reverse(URLEncoder.encode(asciiString, "US-ASCII"));