Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    java.lang.NegativeArraySizeException

    Ciao.

    Non capisco perchè eclipse mi lancia un'eccezione del tipo java.lang.NegativeArraySizeException
    anche se ho creato un array con dimensione positiva.

    Praticamente devo leggere un array di byte contenente un messaggio criptato.
    Però l'array non è di dimensione negativa

    codice:
    byte [] messaggioByte = new byte [1000];
    int numByte2 = in2.read(messaggioByte);
    messaggioByte = Arrays.copyOf(messaggioByte , numByte2);
    String messaggioDecriptato = new String(decipher.doFinal(messaggioByte));

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    codice:
    int numByte2 = in2.read(messaggioByte);
    messaggioByte = Arrays.copyOf(messaggioByte , numByte2);
    Beh, copyOf riceve una lunghezza e la lunghezza è dinamica perché la ricevi da uno stream.
    EDIT: scusa, oggi sono un po' nelle curve ... non avevo visto che gli passi l'array.
    Quel read può ritornare -1 se non ci sono più dati (end of stream).
    Ultima modifica di andbin; 05-06-2014 a 17:40
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Quel read può ritornare -1 se non ci sono più dati (end of stream).
    Accidenti...

    si può fare che non ritorni -1 se non ci sono più dati :

    l'array da leggere è inviato cosi :

    codice:
    OutputStream out = s.getOutputStream();
    byte [] richiestaInvio = new byte [1000];
    richiestaInvio = cipher.doFinal(richiesta.getBytes());
    out.write(richiestaInvio);
    out.close();

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    codice:
    OutputStream out = s.getOutputStream();
    byte [] richiestaInvio = new byte [1000];
    richiestaInvio = cipher.doFinal(richiesta.getBytes());
    out.write(richiestaInvio);
    out.close();
    Nota che qui il new byte [1000]; non serve a nulla. Il doFinal fornisce un nuovo array la cui lunghezza dipende principalmente da cosa c'è in quel richiesta !

    E dato che immagino sia un String, tieni sempre a mente le questioni sui charset quando si passa tra String e byte[].
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Si giusto il new byte [1000] non serve....non si sa a priori la dimensione.

    Cosa intendi per quanto riguarda i charset?
    Caratteri maiuscoli o minuscoli?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Cosa intendi per quanto riguarda i charset?
    Caratteri maiuscoli o minuscoli?
    No, la codifica dei caratteri in byte (es. US-ASCII, ISO-8859-1, UTF-8, ecc...)

    getBytes() usa il charset di default della piattaforma. Su un'altra macchina potrebbe essere differente. E se stai comunicando tra due macchine differenti, potrebbero esserci problemi in quel senso.
    Generalmente è sempre bene "fissare" il charset e tipicamente la scelta cade su UTF-8, perché non perde nulla del Unicode ed è comunque compatto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Originariamente inviata da Markus85codice:
    OutputStreamout= s.getOutputStream();
    byte[] richiestaInvio =newbyte[1000];
    richiestaInvio
    = cipher.doFinal(richiesta.getBytes());
    out.write(richiestaInvio);
    out.close();




    Nota che qui il new byte [1000]; non serve a nulla. Il doFinal fornisce un nuovo array la cui lunghezza dipende principalmente da cosa c'è in quel richiesta !
    Quindi dato che non sappiamo a priori la lunghezza del buffer ; possiamo istanziarlo a null e poi se la vede il cipher per crearlo?

    codice:
    byte [] richiestaInvio = null;
    richiestaInvio = cipher.doFinal(richiesta.getBytes());

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Quindi dato che non sappiamo a priori la lunghezza del buffer ; possiamo istanziarlo a null e poi se la vede il cipher per crearlo?
    public final byte[] doFinal(byte[] input) throws .......

    (è quello che invochi)

    Parameters:
    input - the input buffer
    Returns:
    the new buffer with the result
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.