Copying an Array won't work JAVA - java
I'am trying to copy or duplicate an Array without success
for (int i=0;i<x*y+y;i++)
{
tmpInt = br.read();
//Wenn i%x 0 ist dann brakeY eins hochzählen, um damit die Anzahl der Zeilen zu bekommen
if (i%x==0 && brakeY<y-1) brakeY++;
if (tmpX<=x-1) tmpX++;
else tmpX = 0;
// Beim ersten Ausführen dieser Teilfunktion wird das Array aus der Textdatei ausgelesen. Beim zweiten Mal jedoch gibt es nur den aktuellen Stand der Map wieder um Veränderungen zu sehen.
spielFeld[tmpX][brakeY] = (char) tmpInt;
System.out.print(spielFeld[tmpX][brakeY]);
//System.out.println("----------");
}
I'am trying to copy the Array, called spielFeld (german for playground), in this line spielFeldT = spielFeld.clone(); , (spielFeldT = spielFeld didn't work either) so that I can interact with it globally. The results are:
1xwvutsrqpo
2 ü n
3 !öä m
4 " l
5 K §$% k
789abcdefgh
which is exactly how it's should look like,
but if I'am tyring to print the copied array exactly the same way as I printed this one something like this appears.
1 ü �
3 !öä �n
4 " � l
5 K §$%� k
6 � fgh
789abcdefgh
789abcdefgh
You can use the System.arraycopy(...) method.
Here is the Syntax of the method,
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
For further information, you may want to take a look at this question.
Related
MPEG 2 TS ISOMEDIA complaint
I record audio using android AudioRecord class with success and to make it play with all players i add AAC ADTS headers with success and concatenated all in MPEG 2 TS (.ts) file and it's able to play with all players (native an VLC). But unfortunately this file is not ISOMEDIA compliant to dashing with GPAC. I try to look at a solution and i found that i need to add PES headers to my ES stream. please can't someone know how to add PES headers on top of ADTS headers in MPEG 2 TS using java ? on code below ? enter code here private void addADTStoPacket(byte[] packet, int packetLen) { int profile = 2; //AAC LC //39=MediaCodecInfo.CodecProfileLevel.AACObjectELD; int freqIdx = 4; //44.1KHz int chanCfg = 2; //CPE // fill in ADTS data packet[0] = (byte)0xFF; // conversion hexadecimal a decimal - il y a seize unités de 0 à F, on parle donc d'hexadécimal. packet[1] = (byte)0xF1; // installe l'entete ADTS dans MPEG-2 (0xF1) au lieu de MPEG-4 (0xF9) packet[2] = (byte)(((profile-1)<<6) + (freqIdx<<2) +(chanCfg>>2)); packet[3] = (byte)(((chanCfg&3)<<6) + (packetLen>>11)); packet[4] = (byte)((packetLen&0x7FF) >> 3); packet[5] = (byte)(((packetLen&7)<<5) + 0x1F); packet[6] = (byte)0xFC; // 0xFC est également correct si vous ne connaissez pas la valeur de la plénitude du tampon }
Mainframe comp-3 field reading using JRecord
I am trying to read mainframe file but all are working other than comp 3 file.Below program is giving strange values.It is not able to read the salary value which is double also it is giving 2020202020.20 values. I don't know what am missing.Please help me to find it. Program: public final class Readcopybook { private String dataFile = "EMPFILE.txt"; private String copybookName = "EMPCOPYBOOK.txt"; public Readcopybook() { super(); AbstractLine line; try { ICobolIOBuilder iob = JRecordInterface1.COBOL.newIOBuilder(copybookName) .setFileOrganization(Constants.IO_BINARY_IBM_4680).setSplitCopybook(CopybookLoader.SPLIT_NONE); AbstractLineReader reader = iob.newReader(dataFile); while ((line = reader.read()) != null) { System.out.println(line.getFieldValue("EMP-NO").asString() + " " + line.getFieldValue("EMP-NAME").asString() + " " + line.getFieldValue("EMP-ADDRESS").asString() + " " + line.getFieldValue("EMP-SALARY").asString() + " " + line.getFieldValue("EMP-ZIPCODE").asString()); } reader.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Readcopybook(); } } EMPCOPYBOOK: 001700 01 EMP-RECORD. 001900 10 EMP-NO PIC 9(10). 002000 10 EMP-NAME PIC X(30). 002100 10 EMP-ADDRESS PIC X(30). 002200 10 EMP-SALARY PIC S9(8)V9(2) COMP-3. 002200 10 EMP-ZIPCODE PIC 9(4). EMPFILE: 0000001001suneel kumar r bangalore e¡5671 0000001002JOSEPH WHITE FIELD rrn4500 Output: 1001 suneel kumar r bangalore 20200165a10 5671 2020202020.20 2020202020.20 2020202020.20 2020202020.20 2020202020.20 2020202020.20 2020202020.20 2020202020.20 0.00 1002 JOSEPH WHITE FIELD 202072726e0 4500
One problem is you have done a Ebcdic to Ascii conversion on the file. The 2020... is a dead give away x'20' is the ascii space character. This Answer deals with problems with doing an Ebcdic to ascii conversion. You need to do a Binary transfer from the Mainframe and read the file using Ebcdic. You will need to check the RECFM on the Mainframe. If the RECFM is FB - problems just transfer VB - either convert to FB on the mainframe of include the RDW (Record Descriptor Word) option in the transfer. Other - Convert to FB/VB on the mainframe Updated java Code int fileOrg = Constants.IO_FIXED_LENGTH_RECORDS; // or Constants.IO_VB ICobolIOBuilder iob = JRecordInterface1.COBOL .newIOBuilder(copybookName) .setFileOrganization(fileOrg) .setFont("Cp037") .setSplitCopybook(CopybookLoader.SPLIT_NONE); Note: IO_BINARY_IBM_4680 is for IBM 4690 Registers There is a wiki entry here or this Question How do you generate java~jrecord code fror a Cobol copybook
How can I reset a if-command? Or jump back to the point before the if-command was executed?
So yesterday I asked a question about some GUI-ing. I completly threw that over, since I found it a little to complicated for me to actually deal with it. Now I am reworking the thing in the console. And I got myself stuck again. My problem this time: How can I jump back to a point before a if-command was executed? Direct example: import java.util.Scanner; import java.io.*; public class HBA { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Herzlichen Glückwunsch Anna! Und viel Spaß mit deinem Geschenk!") ; System.out.println("Neben diesem Programm befindet sich eine Passwort gesicherte Datei, die einen weiteren Teil deines Geschenks enthällt." + "Um an das Passwort zu gelangen wirst du jedoch ein paar ganz besonders schwierige Fragen beantworten müssen!" + "Wenn du bereit für das Quiz bist, gib in die Eingabe: 'ok' ein."); String OK, Q1, Q2, Q3, Q4, Q5, Q6, Q7; BufferedReader repo = null; OK = scan.next(); if (OK == "ok") { System.out.println("Alles gut, fangen wir mit etwas leichtem an!"); } else { System.out.println("Wie... bei so einer einfachen Sache versagst du schon? Versuchs nochmal!"); } System.out.println("Frage 1: Wer ist Supergeil? \n A: Erik \n B: Anna \n C: The J \n D: Friedrich Liechtenstein"); mark(0); Q1 = scan.next(); if (Q1 == "D") { System.out.println("Richtig! Der erste Buchstabe lautet: S"); } else { System.out.println("Leider falsch. Versuch es nochmal."); reset(); } } } The scripted works as expected, besides: If you type something wrong in the last part: System.out.println("Frage 1: Wer ist Supergeil? \n A: Erik \n B: Anna \n C: The J \n D: Friedrich Liechtenstein"); mark(0); Q1 = scan.next(); if (Q1 == "D") { System.out.println("Richtig! Der erste Buchstabe lautet: S"); } else { System.out.println("Leider falsch. Versuch es nochmal."); reset(); } } } It just ends the script. Instead it should jump back to the beginning of the if-command. Means: The answer to the question in the System.out.printLn (it is a question) is D and you typ A instead, it should reset the whole thing that you can try it again and answer something different. How can I achieve that? I read that BufferedReader have a mark() and reset() function, but I don't know if they work the way I expect them to or how I would have to integrate them. I also thought about using a while or a do command. But I haven't found a way for that yet. Can someone pls enlighten me? Thanks!
CCITT (Convert C code to JAVA)
I am trying to validate checksums from a device and they give me the below C code for checksum validation, however I cannot convert this code to java and get it to produce the same checksum as the messages. Note this is the entire source code given in document and i have tried several of the example codes online and none of them work for me. Thanks. const unsigned short NET_CRC_TABLE[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; unsigned short NET_CRC_Calc(unsigned char * pData, unsigned short Count) { /* calculate serial CRC (<--CCITT) without changing data */ unsigned char Index; unsigned short Crc=0; while (Count--) { Index = HBYTE_16(Crc); HBYTE_16(Crc) = LBYTE_16(Crc); LBYTE_16(Crc) = *pData++; Crc = (unsigned short)(Crc ^ NET_CRC_TABLE[Index]); } return Crc; } I have no idea what the definitions for HByte and LByte are (which is why I didn't post code initially). They are nowhere in the protocool document, so i assumed they were methods in the C library. Basically outside of the table my code is this: int NET_CRC_Calc(int[] pData, int count) { int index; int crc = 0; for(;count > 0; count--) { index = crc >> 8; //TODO: Find out Hbyte method //LBYTE_16(crc) = pData[count]; ??? crc = (int)(crc ^ NET_CRC_TABLE[index]); } return crc; } If you would like to test your algorithm before posting (trust i will test anything for you!!), below is the string and expected output. String command = "<Ver>1</Ver><DtTm></DtTm><Type>3</Type>"; Expected Output: 0x12AA
First of all, make sure you make the NET_CRC_TABLE of type int[]. You can copy the initializer, though. Next is the pData argument, which is unsigned charin C, and should therefore be a byte array in Java. If you have bytes, make sure that you read unsigned values from the array, by doing (pData[index] & 0xff) Then the loop looks like this: int ptr = 0; while (count-- > 0) { index = (crc >> 8) & 0xff; crc = ((crc & 0xff) << 8) | (pData[ptr++] & 0xff); crc = crc ^ NET_CRC_TABLE[index]; } (I have taken liberty to rename the variables to lowercase, as usual in java. Using uppercase variable and method names is frowned upon in the Java world.) === EDIT === In the case that the whole array must be processed, it makes no sense to pass the count argument at all. Java knows the size of its arrays, unlike C. So, drop the count parameter and change the loop condition like: while (ptr < pData.length) {
Based on Ingo's answer, here is a complete solution: boolean isValidCrc16(int[] crcTable, int crcCode, byte[] toValidate) { int ptr = 0; int index; int computedCrcCode = 0; boolean isValid; while (ptr < toValidate.length) { index = (computedCrcCode >> 8) & 0xff; computedCrcCode = ((computedCrcCode & 0xff) << 8) | (toValidate[ptr++] & 0xff); computedCrcCode = computedCrcCode ^ crcTable[index]; } return computedCrcCode == crcCode; }
Jsoup Elements maxes at 20 entries
the size of my Jsoup Elements seems to be maxed at size 20, no matter what I do. The purpose is to: Pull the the specified page Select the elements I am interested in (timestamps and texts atm) Combine the selected elements in a new list and print. But somehow only the first 20 entries will be included. (compare output on console with actual page) Can someone give me any hint on where I am lacking the deeper understanding? Thank you very much and best wishes, kw Console output: 22:59 Mein lieber Arbeitskollege hat mich nach Feierabend noch im Studio besucht... 23:02 Und??? 23:04 Ich sag nur Personalküche! :D 23:05 Fühl dich gehighfived! ✋:D 10:30 Haha ich hab eben beim REWE einer Frau mit 2 kleinen Kindern im Wagen 5 Tüten Sticker geschenkt die ich an der Kasse bekommen hab. Die werden sich jetzt den ganzen Tag über das letzte Päckchen streiten. Ich bin so ein teuflisches Genie! 😃😈😈 09:04 Ihr Dorfis könnt ja doch ganz schön gut Party machen 09:55 ...und wir wissen das Kühe nicht Lila sind! 00:13 Mein Bett ist viel zu groß um allein drin zu liegen.. 00:15 Meins auch 00:16 Wir sind wie die Arschlöcher, die allein mit ihren dicken Autos rumfahren ohne Fahrgemeinschaften zu gründen. 00:20 Bettgemeinschaft? Code: import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class SmsGetter { public static void main(String[] args) throws IOException { String url = "http://www.smsvongesternnacht.de"; Document doc = Jsoup.connect(url).timeout(30000).get(); Elements timestamps = doc.select(".sms-tag"); Elements texts = doc.select(".sms-bubble"); Elements sms = new Elements(400); for(int i=0; i<timestamps.size(); i+=2) { sms.add(i, timestamps.get(i/2)); sms.add(i+1, texts.get(i/2)); } for (Element entries:sms) { System.out.format(" %s", entries.text()); System.out.println(); } } } Edit: Inserted missing line.
I would have selected your elements by the sms-participant class. Having two selects from the document is causing you to write that weird for loop where you are assuming sms-tag and sms-bubble are the same size. That being said I looked at the page and there are only twenty sms-participant entries shown.