将byte []转换为String然后再转换为byte []

时间:2010-05-03 14:16:54

标签: java string bytearray

我正在使用代理服务器。我正在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}}时,我的代理工作正常问题。

有人可以帮忙吗? =]

4 个答案:

答案 0 :(得分:9)

byte[]转换为String并重新转换为byte[]的最佳方法是不要这样做。

如果必须,您必须知道用于生成byte[]的编码,否则操作将使用平台默认编码,这会破坏数据,因为并非所有编码都可以编码所有可能的字符串,并且并非所有可能的字节序列在所有编码中都是合法的。这就是你的情况。

至于如何找出编码,取决于:

  • 如果您使用的是HTTP,请查看Content-Type header
  • 如果您的数据是XML,那么您应该使用XML解析器,它将为您处理编码
  • 如果您的数据是HTML网页,则可能还有<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);
}