2013-09-05 4 views
1

Quelqu'un peut-il dire ce mal avec ce code, ce que je fait est queJava Socket INPUTSTREAM Lecture erronée des données

  1. client envoyer des données d'image qui est un tableau uchar de C++.
  2. Le serveur Java reçoit ces données à l'aide du socket serveur et les stocke en tant que tableau d'octets.

Voici le code ...

private ServerSocket serverSocket; 
    InputStream in; 
    int imageSize=300;//921600;//expected image size 640X480X3 
    public imageReciver(int port) throws IOException { 
     serverSocket = new ServerSocket(port); 
    } 


     Socket server = null; 
     server = serverSocket.accept(); 
     in = server.getInputStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte buffer[] = new byte[100]; 

     int remainingBytes = imageSize; // 
     while (remainingBytes > 0) { 
     int bytesRead = in.read(buffer); 
     if (bytesRead < 0) { 
     throw new IOException("Unexpected end of data"); 
     } 
     baos.write(buffer, 0, bytesRead); 
     remainingBytes -= bytesRead; 
     } 
     in.close(); 

     byte imageByte[] = new byte[imageSize];   
     imageByte = baos.toByteArray(); 
     baos.close(); 

Pendant la lecture de inputstream in Je reçois une valeur négative sur buffer.

+0

Avez-vous vérifié la taille de l'image? – Xabster

+0

Oui, j'envoie 300 octets exactement ... – Haris

Répondre

3

Je pense que le problème est:

octet de Java est signé et que vous envoyez octets non signés.

De Java docs:

octet: Le type de données d'octet est un nombre entier signé complément à deux de 8 bits. Il a une valeur minimale de -128 et une valeur maximale de 127 (inclusivement). Le type de données d'octet peut être utile pour enregistrer de la mémoire dans de grandes baies, où l'économie de mémoire importe réellement. Ils peuvent également être utilisés dans endroit d'int où leurs limites aident à clarifier votre code; le fait que la plage d'une variable est limitée peut servir de forme de documentation .

Vous pouvez essayer quelque chose comme:

short bVal = /*signed byte*/; 
if (bVal < 0) 
    bVal = bVal + 256; //Convert to positive 

Edit: Comme l'a souligné @Aubin, un court sera un meilleur choix au lieu d'un int.

0

La représentation d'une donnée comme signée ou non signée est une convention humaine. Cette convention est utilisée par le processeur lorsque l'arithmétique est utilisée.

Ce n'est pas le cas ici: c'est simple à lire et à écrire et le fait que le bit 7 soit utilisé comme drapeau négatif ou pas comme aucun effet.

La lecture d'un socket et l'écriture d'un fichier peuvent être effectuées avec un tampon d'octets ou mieux avec ByteBuffer. I suggest a buffer size of 8K.

Réécrire le code en utilisant java.nio.channels peut être mieux.