我正在使用代理服务器。我正在byte[]
中获取数据,我将其转换为String
以执行某些操作。现在,当我将这个新String
转换回byte[]
时,会导致未知问题。
所以主要是因为我需要知道如何正确地将byte[]
转换为String
然后再转换回byte[]
。
我尝试将byte[]
转换为String
,然后再将byte[]
转换回// where reply is a byte[]
String str= new String(reply,0, bytesRead);
streamToClient.write(str.getBytes(), 0, bytesRead);
(以确保其不是导致问题的操作)。
所以就像:
streamToClient.write(reply, 0, bytesRead);
不等于
byte[]
当我发送byte[]
而没有任何转化但我将其从String
转换为byte[]
然后再转回{{1}}时,我的代理工作正常问题。
有人可以帮忙吗? =]
答案 0 :(得分:9)
将byte[]
转换为String
并重新转换为byte[]
的最佳方法是不要这样做。
如果必须,您必须知道用于生成byte[]
的编码,否则操作将使用平台默认编码,这会破坏数据,因为并非所有编码都可以编码所有可能的字符串,并且并非所有可能的字节序列在所有编码中都是合法的。这就是你的情况。
至于如何找出编码,取决于:
<meta http-equiv>
标题如果无法找到编码你有随机垃圾,而不是文本数据。
答案 1 :(得分:4)
如果它的有符号字节数组,那么我找到的最简单的解决方案是使用BASE64EncoderStream对字节数组进行编码,这将把它转换为无符号字节。 然后你将不得不使用BASE64DecoderStream来解码字节以获取原始的有符号字节数组。
BASE64的POM依赖关系:com.sun.mail javax.mail 1.4.4
public class EncryptionUtils {
private static String ALGO = "AES";
private static Cipher cipher;
public static String encrypt(String message, String keyString) {
cipher = Cipher.getInstance(ALGO);
Key key = generateKey(keyString);
cipher.init(Cipher.ENCRYPT_MODE, key);
return new String(BASE64EncoderStream.encode(cipher.doFinal( message.getBytes())));
}
public static String decrypt(String message, String keyString) {
cipher = Cipher.getInstance(ALGO);
Key key = generateKey(keyString);
cipher.init(Cipher.DECRYPT_MODE, key);
return new String(cipher.doFinal(BASE64DecoderStream.decode(message.getBytes())));
}
private static Key generateKey(String keyString) throws NoSuchAlgorithmException {
byte[] keyBytes = BASE64DecoderStream.decode(keyString.getBytes());
Key key = new SecretKeySpec(keyBytes, ALGO);
return key;
}
public static void main(String args[]) {
byte[] keyValue = new byte[16];
new SecureRandom().nextBytes(keyValue);
String key = new String(BASE64EncoderStream.encode(keyValue));
String message = "test message";
String enc = encrypt(message, key);
String dec = decrypt(enc, key);
System.out.println(dec);
}}
答案 2 :(得分:3)
您需要知道所使用的字符编码,使用它解码字节并使用相同的字符编码重新编码。例如:
String str = new String(reply, 0, Charset.forName("UTF-8"));
bytes[] out = str.getBytes(Charset.forName("UTF-8"));
streamToClient.write(bytes, 0, bytes.length);
如果没有指定,Java使用默认的字符编码,通常是UTF-8(甚至可能是强制性的),但HTML通常是其他的。我怀疑那是你的问题。
答案 3 :(得分:0)
从套接字读取并发送到另一个套接字时,我遇到了类似的问题,但我的问题是我使用BufferedOutputStream编写输出,当我将其更改为输出流时,它可以工作。我认为缓冲输出流存在问题。
String mensaje ="what I want to send";
String ip = "192.168.161.165";
int port = 2042;
tpSocket = new Socket(ip, port);
os = tpSocket.getOutputStream();
byte[] myBytes= mensaje.getBytes();
ByteArrayInputStream byarris = new ByteArrayInputStream(myBytes);
int resulta =0;
byte[] bufferOutput= new byte[1];
while((resulta = byarris.read(bufferOutput))!= -1) {
os.write(bufferOutput);
}