2017-08-10 6 views
1

J'utilise actuellement Netty. Maintenant, le problème est, je veux récupérer une chaîne spécifique à partir du tampon. Par exemple, si les données de la mémoire tampon est la suivante:Comment obtenir un motif de chaîne spécifique à partir d'un tableau tampon/octet continu dans Netty JAVA?

8=FIX.4.2|9=00815|35=W|49=TT_PRICE|56=SAP0094X|10=134|8=FIX.4.2|9=00816|35=W49=TT_PRICE|56=SAP0094X|10=121 

Maintenant, je veux les chaînes commençant par « 8 = xxx » et se terminant par « 10 = xxx ». Vous pouvez clairement voir que nous avons deux chaînes ajoutées dans le tampon. Notez que les données ci-dessus sont dans un tableau d'octets. Donc, parfois je reçois la chaîne exacte et un peu de temps je reçois la chaîne et une autre moitié de la chaîne complète en annexe. Tout ce que je veux est, comment puis-je obtenir la chaîne exacte à partir de "8 = xxx" à "10 = xxx". J'ai vu la classe DelimiterBasedFrameDecoder dans Netty qui vérifie simplement le délimiteur spécifié et nous donne les chaînes. De la même manière, comment puis-je faire cela?

Répondre

2

Ma suggestion serait de traduire le tampon et utiliser une expression régulière pour répondre à vos sous-chaînes cibles:

ByteBuffer bb = /* byte buffer */ 
String text = new String(bb.array(), 0, bb.position(), bb.remaing(), Charset.defaultCharset()); 

// I assume that this is the string: "8=FIX.4.2|9=00815|35=W|49=TT_PRICE|56=SAP0094X|10=134|8=FIX.4.2|9=00816|35=W49=TT_PRICE|56=SAP0094X|10=121" 

// If you need info on the regex just ask for it 
Pattern r = Pattern.compile("(8=\\w\\w\\w)[\\s\\S]*?(10=\\w\\w\\w)"); 
Matcher m = r.matcher(text); 

while (m.find()) { 
    System.out.println(m.group()); 
} 

Notez que Charset.defaultCharset() pourrait être la base modifiée sur laquelle l'encodage de votre ByteArray utilise

+0

s'il vous plaît noter que l'utilisation 'bb.array()' n'est sauvegardé que lorsque 'bb.hasArray()' renvoie true. et vous devez également prendre 'bb.arrayOffset()' en compte. –

+0

Merci. Mais comme j'utilise Netty ici, j'obtiendrai ByteBuf au lieu de ByteBuffer ici. –

+0

pour obtenir une chaîne de ByteBuf en utilisation netty: ByteBuf.toString (jeu de caractères). –