Writting to Bytes

Hi all Java Minds......
In my project, am in need to write bytes as follows. For eg,. if we take Credit card, the card number should have card id with 16 bytes.
The card id was splitted as
Card Type - 2 Bytes
Version - 2 Bytes
Unique ID - 4 Bytes
Card Flag - 1 Byte
Card Specific Type - 2 Bytes
Reserved for others - 5 Bytes.
So I need to create 16 Bytes Card ID with this specification. How can this should be? I'm new to this. Please help me. If any one know, please let me know the way and sample source.
Thanks & Regards,
Sakthivel Thangasamy
[email protected]

Hi Friend
You can make a data Structure for your cardID
I am giving you two examples
check if anyone can help you otherwise gaive a bried what kind of values you are expecting to put init
class cardID implements Serializable
          byte cardtype[]=new byte[2];          
          byte version[]=new byte[2];
          byte uniqueID[]=new byte[4];
          byte cardFlag[]=new byte[1];
          byte cardSpecificType[]=new byte[2];
          byte reservedForOthers[]=new byte[5];
          public byte[] getCardFlag() {
               return cardFlag;
          public void setCardFlag(byte[] cardFlag) {
               this.cardFlag = cardFlag;
          public byte[] getCardSpecificType() {
               return cardSpecificType;
          public void setCardSpecificType(byte[] cardSpecificType) {
               this.cardSpecificType = cardSpecificType;
          public byte[] getCardtype() {
               return cardtype;
          public void setCardtype(byte[] cardtype) {
               this.cardtype = cardtype;
          public byte[] getReservedForOthers() {
               return reservedForOthers;
          public void setReservedForOthers(byte[] reservedForOthers) {
               this.reservedForOthers = reservedForOthers;
          public byte[] getUniqueID() {
               return uniqueID;
          public void setUniqueID(byte[] uniqueID) {
               this.uniqueID = uniqueID;
          public byte[] getVersion() {
               return version;
          public void setVersion(byte[] version) {
               this.version = version;
     class cardID1 implements Serializable
          char cardtype;          
          char version;
          int uniqueID;
          byte cardFlag;
          char cardSpecificType;
          byte reservedForOthers[]=new byte[5];
          public byte getCardFlag() {
               return cardFlag;
          public void setCardFlag(byte cardFlag) {
               this.cardFlag = cardFlag;
          public char getCardSpecificType() {
               return cardSpecificType;
          public void setCardSpecificType(char cardSpecificType) {
               this.cardSpecificType = cardSpecificType;
          public char getCardtype() {
               return cardtype;
          public void setCardtype(char cardtype) {
               this.cardtype = cardtype;
          public byte[] getReservedForOthers() {
               return reservedForOthers;
          public void setReservedForOthers(byte[] reservedForOthers) {
               this.reservedForOthers = reservedForOthers;
          public int getUniqueID() {
               return uniqueID;
          public void setUniqueID(int uniqueID) {
               this.uniqueID = uniqueID;
          public char getVersion() {
               return version;
          public void setVersion(char version) {
               this.version = version;
     }both the above classes have a memory capacity of 16 bytes as you are expecting and can be wriiten as object to file or String etc

Similar Messages

  • Most efficient way to write 4 bytes at the start of any file.

    Quick question: I want to write 4 bytes at the start of a file without overriding the current bytes in the file. E.g. push bytes 0-4 along... Is my only option writing the bytes into a new file then writing the rest of the file after? RAF is so close but overrides :(.
    Thanks Mel

    I revised the code to use a max of 8MB buffers for both the nio and stdio copies...
    Looks like NIO is a pretty clear winner... but your milage may vary, lots... you'd need to test this 100's of times, and normalize, to get any "real" metrics... and I for one couldn't be bothered... it's one of those things that's "fast enough"... 7 seconds to copy a 250 MB file to/from the same physical disk is pretty-effin-awesome really, isn't it? ... looks like Vista must be one of those O/S's (mentioned in the API doco) which can channel from a-to-b without going through the VM.
    ... and BTW, it took the program which produced this file 11,416 millis to write it (from an int-array (i.e. all in memory)).
    revised code
    package forums;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.channels.FileChannel;
    class NioBenchmark1
      private static final double NANOS = Math.pow(10,9);
      private static final int BUFF_SIZE = 8 * 1024 * 1024; // 8
      interface Copier {
        public void copy(File source, File dest) throws IOException;
      static class NioCopier implements Copier {
        public void copy(File source, File dest) throws IOException {
          FileChannel in = null;
          FileChannel out = null;
          try {
            in = (new FileInputStream(source)).getChannel();
            out = (new FileOutputStream(dest)).getChannel();
            final int buff_size = Math.min((int)source.length(),BUFF_SIZE);
            long n = -1;
            int pos = 0;
            while ( (n=in.transferTo(pos, buff_size, out)) == buff_size ) {
              pos += n;
          } finally {
            if(in != null) in.close();
            if(out != null) out.close();
      static class NioCopier2 implements Copier {
        public void copy(File source, File dest) throws IOException {
          if ( !dest.exists() ) {
            dest.createNewFile();
          FileChannel in = null;
          FileChannel out = null;
          try {
            in = new FileInputStream(source).getChannel();
            out = new FileOutputStream(dest).getChannel();
            final int buff_size = Math.min((int)in.size(),BUFF_SIZE);
            long n = -1;
            int pos = 0;
            while ( (n=out.transferFrom(in, 0, buff_size)) == buff_size ) {
              pos += n;
          } finally {
            if(in != null) in.close();
            if(out != null) out.close();
      static class IoCopier implements Copier {
        private byte[] buffer = new byte[BUFF_SIZE];
        public void copy(File source, File dest) throws IOException {
          InputStream in = null;
          FileOutputStream out = null;
          try {
            in = new FileInputStream(source);
            out = new FileOutputStream(dest);
            int count = -1;
            while ( (count=in.read(buffer)) != -1) {
              out.write(buffer, 0, count);
          } finally {
            if(in != null) in.close();
            if(out != null) out.close();
      public static void main(String[] arg) {
        final String filename = "SieveOfEratosthenesTest.txt";
        //final String filename = "PrimeTester_SieveOfPrometheuzz.txt";
        final File src = new File(filename);
        System.out.println("copying "+filename+" "+src.length()+" bytes");
        final File dest = new File(filename+".bak");
        try {
          time(new IoCopier(), src, dest);
          time(new NioCopier(), src, dest);
          time(new NioCopier2(), src, dest);
        } catch (Exception e) {
          e.printStackTrace();
      private static void time(Copier copier, File src, File dest) throws IOException {
        System.gc();
        try{Thread.sleep(1);}catch(InterruptedException e){}
        dest.delete();
        long start = System.nanoTime();
        copier.copy(src, dest);
        long stop = System.nanoTime();
        System.out.println(copier.getClass().getName()+" took "+((stop-start)/NANOS)+" seconds");
    output
    C:\Java\home\src\forums>"C:\Program Files\Java\jdk1.6.0_12\bin\java.exe" -Xms512m -Xmx1536m -enableassertions -cp C:\Java\home\classes forums.NioBenchmark1
    copying SieveOfEratosthenesTest.txt 259678795 bytes
    forums.NioBenchmark1$IoCopier took 14.333866455 seconds
    forums.NioBenchmark1$NioCopier took 7.712665715 seconds
    forums.NioBenchmark1$NioCopier2 took 6.206867074 seconds
    Press any key to continue . . .Having said that... The NIO has lost a fair bit of it's charm... testing transferTo's return value and maintaining your own position in the file is "cumbsome" (IMHO)... I'm not even certain that mine is completely correct (?n+=pos or n+=pos+1?).... hmmm..
    Cheers. Keiths.

  • How to  write the bytes out

    I have the working code to write the byte[] to the OutputStream, and it works
           ServletOutputStream out = null;
           BufferedInputStream in = null;
            try {
                byte[] bytes = new byte[1024];
                raf = new RandomAccessFile(restoreZipFile, "r");
                raf.seek(10);
                raf.readFully(bytes);
                out = resp.getOutputStream();
                 in = new BufferedInputStream(new ByteArrayInputStream(bytes));
                 int data;
                 while ((data = in.read()) != -1) {
                     out.write(data);
                 out.write(bytes);
                 out.close();
                 in.close();
             catch (Exception e) {
                 log.error("Failed to write.", e);
             }Then, I thought about it. I think it was silly to use the BufferedInputStream again snice the RandomAccessFile already reads to byte[]. Therefore, I skipped the BufferedInputStream and it works. Please correct me if I skipped the BufferedInputStream is a bad idea, thank!
           ServletOutputStream out = null;
            try {
                byte[] bytes = new byte[1024];
                raf = new RandomAccessFile(restoreZipFile, "r");
                raf.seek(10);
                raf.readFully(bytes);
                out = resp.getOutputStream();
                out.write(bytes);
                out.close();
             catch (Exception e) {
                 log.error("Failed to write.", e);
                 return false;
             }

    Your first code sample writes the data out twice, right?
    //once:
    in = new BufferedInputStream(new ByteArrayInputStream(bytes));
    int data;
    while ((data = in.read()) != -1) {
        out.write(data);
    //twice:
    out.write(bytes);And yes, the second way is simpler.

  • DBMS_LOB.WRITE fails to write multi-byte data

    We have Oracle 8.1.6 database, UTF8, and a table with a CLOB column. I'm trying to write some multi-byte data (Japanese) to that CLOB using DBMS_LOB.WRITE(lob_loc,48,1,v_buffer);
    I get ORA-00600: internal error code, arguments: [711], [25806920], [koklt2u buf], [], [], [], [], []
    The data I'm trying to insert is UTF8 encoded(because I selected it from another table in the same database).
    Do I need to convert it to a multi-byte fixed width Unicode encoding to store in CLOB? I thought this would happen automatically.
    The DBMS_LOB.WRITE seemed worked OK when I wrote extended ASCII chars to the CLOB, but doesn't work for Japanese.
    null

    I think this is related to Bug 745585 - If the database char character set is varying-width, and you call DBMS_LOB.WRITE() with an input amount that is greater than the data in the buffer, you will get an internal error. The workaround is to provide the correct amount of data in the buffer.

  • Oracle BLOB Writes the Bytes Twice to Output Stream

    Hi,
    I have a very strange problem when working with oracle.sql.BLOB; I cannot figure out what it's causing my BLOB stream output to double the amount of data inserted into the Oracle database. I have a table that contains two BLOB objects(image files) and the goal is to insert two images into each row by BLOB stream.
    For example, if the image_bin size is 800k and image_thumbnail size is 100k, this code actually writes 1600k (double) and 200k (double) the amount of bytes to each BLOB column, respectively. The print method in insertBlob() indicates a correct number of bytes being written to the output stream (800k and 100k).
    I know for the fact the retrieval method (not mentioned here) doesn't duplicate the bytes when it's read because I have written another test program that does not utilize oracle.sql.BLOB but instead uses PreparedStatement's setBinaryStream(index, InputStream, size_of_file) and it accurately writes the exact image size (no double sizing) to the database -- but not with BLOB. Here's a snippet of my code, note that the actual writing occurs in insertBlob():
    private void insertBlob(java.sql.Blob lobImage, String imgName)
    throws SQLException, IOException {
    File imgFile = null;
    FileInputStream imgOnDisk = null;
    OutputStream imgToDB = null;
    int bufferSize = 0;
    oracle.sql.BLOB blobImage = (oracle.sql.BLOB) lobImage;
    try {
    int bytesRead = 0;
    long bytesWritten = 0L;
    byte[] byteBuffer = null;
    bufferSize = blobImage.getBufferSize();
    byteBuffer = new byte[bufferSize];
    imgFile = new File(imgName);
    // Stream to read the file from the local disk
    imgOnDisk = new FileInputStream(imgFile);
    // Stream to write to the Oracle database
    imgToDB = blobImage.setBinaryStream(imgFile.length());
    // Read from the disk file and write to the database
    while ((bytesRead = imgOnDisk.read(byteBuffer)) != -1 ) {
    imgToDB.write(byteBuffer, 0, bytesRead);
    bytesWritten += bytesRead;
    } // end of while
    System.out.print("Done. " + bytesWritten + "-bytes inserted, buffer size: " +
    bufferSize + "-bytes, chunk size: " +
    blobImage.getChunkSize() + ".\n");
    } catch (SQLException sqlEx) {
    System.out.println("SQLException caught: JDBCOracleLOBBinaryStream.processBlob()");
    connRollback();
    throw sqlEx;
    } catch (IOException ioe) {
    System.out.println("IOException caught: JDBCOracleLOBBinaryStream.processBlob()");
    throw ioe;
    } finally {
    try {
    if (imgOnDisk != null ) {
    imgOnDisk.close();
    if (imgToDB != null ) {
    imgToDB.close();
    } catch (IOException ioeClosing) {
    System.out.println("IOException caught: JDBCOracleLOBBinaryStream.processBlob() " +
    "on closing stream.");
    ioeClosing.printStackTrace();
    } // end of finally
    public void insertImageIntoOracleDB() throws SQLException, IOException {
    PreparedStatement pstmt = null;
    Statement stmt = null;
    ResultSet rset = null;
    try {
    this.getConnection(_driver, host, port, database, user, _pass);
    pstmt = conn.prepareStatement("INSERT INTO " +
    " gallery_v (picture_id, picture_title, image_bin, image_thumbnail) " +
    " VALUES (?, ?, EMPTY_BLOB(), EMPTY_BLOB())");
    pstmt.setInt(1, picID);
    pstmt.setString(2, picTitle);
    pstmt.executeUpdate();
    stmt = conn.createStatement();
    rset = stmt.executeQuery("SELECT image_bin, image_thumbnail FROM gallery_v " +
    " WHERE picture_id = " + picID + " FOR UPDATE");
    int rsetCount = 0;
    oracle.sql.BLOB imgBlob = null;
    oracle.sql.BLOB imgThumbBlob = null;
    while (rset.next()) {
    imgBlob = ((OracleResultSet) rset).getBLOB("image_bin");
    System.out.print("Inserting " + img + "... ");
    insertBlob(imgBlob, img);
    imgThumbBlob = ((OracleResultSet) rset).getBLOB("image_thumbnail");
    System.out.print("Inserting " + imgThumb + "... ");
    insertBlob(imgThumbBlob, imgThumb);
    rsetCount++;
    System.out.println("\nNumber of rows updated: " + rsetCount);
    conn.commit();
    } catch (SQLException sqlEx) {
    System.out.println("SQLException caught: JDBCOracleLOBBinaryStream.insertImageIntoOracleDB()");
    connRollback();
    throw sqlEx;
    } catch (IOException ioe) {
    throw ioe;
    } finally {
    try {
    if (rset != null) {
    rset.close();
    if (pstmt != null) {
    pstmt.close();
    if (stmt != null) {
    stmt.close();
    closeConnection();
    } catch (SQLException closingSqlEx) {
    System.out.println("SQLException caught: JDBCOracleLOBBinaryStream.insertImageIntoOracleDB() " +
    "on closing ResultSet or PreparedStatement.");
    closingSqlEx.printStackTrace();
    } // end of finally
    }

    Make a lumpy mistake; the new BLOB#setBinaryStream() method takes a position of where the data is read from in the stream given to it. So the following code:
    imgToDB = blobImage.setBinaryStream(imgFile.length());
    Starts off from the end of the file. Now I don't understand how this position would result in the duplicated amount of bytes read from the binary file (an image here) to the output stream! The correct line should be:
    imgToDB = blobImage.setBinaryStream(0L);
    ARGH!!! Now everything works as it expected. I gotta read the API's more carefully as I was expecting the same semantic parameter as PreparedStatement#setBinaryStream() which takes the length of the stream as one of its parameters.

  • BufferedOutputStream do not write all byte array in linked OutputStream

    Hello,
    I am writing a proxy.When a proxy works like transparent
    "clientOut.write(response, 0, responseLength);"
    clientOut is
    "BufferedOutputStream clientOut = new BufferedOutputStream(pSocket.getOutputStream());"
    All is works right,but when I change response array
    "responseProxy = modi_content(response,word,color);"
    "modi_content" is a function, who change original response.
    After that, I want to write modified response in client stream
    "clientOut.write(responseProxy, 0, responseProxy.length);".
    The result is that, not all bytes from responseProxy are wrote in OutputStream and
    the web page have no all source code and desplays incorrect in browser.
    Do you have any ideas, where I make mistake and who is that mistake.
    Thank you.

    when type
    "System.out.println(new String(responseProxy));"
    all data is good,but after
    "clientOut.write(responseProxy, 0, responseProxy.length);"
    browser dislay not all page.
    Function "modi_content" just insert a javascript in response.

  • Java in writting a byte

    If we write integer or double through java in a file then the bit pattern for eanch is reverse than any other language (like C/ delphi .e:g delphi writes an integer as A@~! but java writes as !~@A).
    How can we convert java pattern to other pattern for integer and float/double?

    Then you must split the integers to bytes in the order you want.
    You can do it like this
    public byte[] toBytes(int i) {
      byte[] b = new byte[4];
      byte b[0] = (i & 0xff000000) >>> 24;
      byte b[1] = (i & 0x00ff0000) >>> 16;
      byte b[2] = (i & 0x0000ff00) >>> 8;
      byte b[3] = i & 0x000000ff;
    public int toInt(byte[] b) {
      int i = (b[0]<<24)+(b[1]<<16)+(b[2]<<8)+b[3];
    }Maybe this example is in the reverse order that you want, but it's easy to make it the other way around.
    With these methods you can read and write bytes from a stream and convert them to and from integers.
    Regarding float, you can convert it to an int first, and then use
    float f = Float.intBitsToFloat(toInt(b));
    where b again is a bytearray of 4 bytes using the described method.
    Something similar can be done with long and double.

  • How to trigger so action when ServerletOuput stream writes all data as byte

    Hi ,
    I have a servlet which accepts the index , size of a .3gp file in bytes as input parameters.
    If index=0 ...i am reading whole file into buffered input streame and writing to client as Servlet output steam as bytes.
    If index !=0 , or index=100 ...say suppose
    im ommiting first 100 bytes and rading101 byte to till the end of file in to buffered input streame and writing to client as Servlet output steam as bytes.
    Here i would like to trigger some action when the servlet writes entire bytes to the client .
    But im not able to notify exactly when the connection can close between client and server.
    Can any one help me to overcome this.
    Thanks in advance.

    Hi ,
    Thanks for reply..
    But reallu i couldnt get you.
    please go though the code snippet i have...and suggest me.
    try{
    File fFile = new File (fileName);
    BufferedInputStream bif = new BufferedInputStream(new FileInputStream(fFile));
         bif.skip(Integer.parseInt(((DownloadFileForm)o).getIndex()));
    int byteSize = (bif.available() < Integer.parseInt(((DownloadFileForm)o).getSize())) ? bif.available() : Integer.parseInt(((DownloadFileForm)o).getSize());
    byte[] b = new byte[byteSize];
    bif.read(b, 0, byteSize);
    sosStream = response.getOutputStream();
    sosStream.write(b);
    // here i have to do something
    sosStream.close();
    logger.info("file has been downloaded from Server is sending out to client");
    }catch(Exception e)
    // e.printStackTrace();
    logger.info("Exception :"+e.toString());
    regards,

  • How do I write and read a specified number of bytes using C++?

    I need to send one byte commands followed by 1 or 2 byte data as well as read 1 or 2 byte commands from a RS232 device. How do I ensure that only 1 byte is sent for the commands or 2 bytes of data using VISA?

    Hey BMas05,
    Using VISA in C++ you can strings or bytes depending on which polymorphic version of the write you are using. One of the parameters for the VISA Write is the byte array and the number of bytes. This is if you are using the VISA classes for C++. You might have to have Measurement Studio to get these classes.
    There is a really good example that installs on your computer at C:\Program Files\National Instruments\MeasurementStudio\VC\Examples\Io\Visa\Serial Visa.
    This example shows how you can write just bytes or strings and you can select how many bytes to read back.
    I hope this helps out.
    JoshuaP
    National Instruments

  • FileWriter to write bytes

    Hi can I use the FileWriter class to write bytes arrays int a file or its exclusive for text?
    I used to use the common output streams (DATA and FILE) but for the appending issue I want to use the FileWriter. So, will it write correctly bytes instead of text?

    Hi can I use the FileWriter class to write bytes
    arrays int a file or its exclusive for text?For text.
    >
    I used to use the common output streams (DATA and
    FILE) but for the appending issue I want to use the
    FileWriter. So, will it write correctly bytes instead
    of text?Not really!

  • How do I display a GIF image stored in byte[ ]

    I have a bit of sticky problem and am now stuck. I will post a little code in the hopes someone more clever than I can give me a hand
    I am using a servlet to grab some data from a user, a web service (still within the servlet) is then called that generates a GIF of the user location as
    specified by the address data grabbed from the user input (GET via the url parameters). The byte data is stored in a bean as a byte [ ] and added to the request as an attribute
    via request.setAttribute().
    I then forward to a jsp page that looks like this:
         <html>
         <head>
         <title>Learn Fast or Perish</title>
         </head>
         <body>
         <center>
         <hr>
         </center>
         <h1>Hello World.</h1>
         <jsp:include page="/display" flush="true"/>
         </body>
         </html>.../display maps to another servlet. The doGet portion of the servlet looks like this:
                //response and request are the HTTPServletResponse/Request doGet parameters
                //ImageByteInformation is my bean holding image info in byte [] format
                ImageByteInformation imageByteInfo = (ImageByteInformation) request.getAttribute("imageByteInformation");
                ImageIcon imageIcon = new ImageIcon(imageByteInfo.getByteData());
                Image image = imageIcon.getImage();
                //create a BufferedImage from the image
                BufferedImage bufferedImage = new BufferedImageCreator().createBufferedImage(image);
                System.out.println("BufferedImage length: " + bufferedImage.getHeight() + "BufferedImage width: " + bufferedImage.getWidth());//400 by 600
                System.out.println("BufferedImage string: " + bufferedImage.toString());
                //prints out: BufferedImage@93afae: type = 2 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width=600 yada yada
                response.setContentType("/image/gif");
                OutputStream stream = response.getOutputStream();
                ImageIO.write(bufferedImage, "gif", stream);
                stream.close();... i found the code above on line and this is supposed to display a GIF to a web page.
    For a while the code was actually prompting if I wanted to download a file of type "/image/gif"?!?
    I did download and save it as temp.gif and the image was there when I opened it on my desktop.
    Something is in the byte array but I cannot get it to display on the page. So what am I doing wrong.
    So my question is this...
    How can I display the gif info stored as a byte [] (byte array) in a bean with a jsp page. I thought including a servlet that
    writes the bytes to the reponse would but no such luck. Is what I am trying possible? This newbie would greatly appreciate
    any advice :)

    First of all the following line is a little off:
    response.setContentType("/image/gif");should be
    response.setContentType("image/gif");What you should do is rather than do an include, try something like the following:
    <img src="/display" />If you're telling me that /display is mapped to the servlet that has the doGet you reference, this would be the proper way to do it.
    HTH.

  • Image Byte size in "Save for Web"-Dialog is wrong?

    The Image Byte size in the finder is always larger than the size stated in Photoshop's "Save for Web"-Dialog box. For example, it shows me 34,36 KB in the SfW-Dialog, while the file information in Finder puts out "38,831 KB". Does anybody know how to fix this annoying behaviour?
    kind regards,
    tomasio

    The size reported in the Finder can be in base 1000 (lying numbers used by disk makers) instead of base 1024 (actual bytes) if you don't change the settings.
    The size reported in the Finder can include the resource fork (metadata and thumbnails, some added by the OS), plus some extra space for disk block allocations (if you write 1 byte to a file, it still takes 4k or more of disk space).
    The size given in SFW is a close estimate of the actual number of bytes written to the disk, and usually matches the size reported by FTP and the web server (sometimes the estimate is off by a little bit due to the final compression options chosen).
    But SFW cannot account for the oddities of the Finder or Windows Explorer's accounting of file size.

  • Java - Write And Read From memory Like CheatEngine ( Writing not working?)

    Hello Oracle Forum
    I came here some time ago to ask about javaFX , i solved all my issues and im right now waiting for javaFx tot ake over swing and hmm, im working on learning LIBGDX to create games in java.
    However, im in need to create an app to change values of memory to fix a bug in an old program that i have, and the only way until now is using cheatEngine, So i decided to take a tutorial and learn how to do that in java.
    Well, im able to read from the memory but the write isnt working somehow... Im posting the code here, if anyone can give me a hint, i would thank and a lot, because theres a community that really needs this app to automate the fix without using cheat engine.
    package MainStart;
    import com.br.HM.User32;
    import com.br.kernel.Kernel32;
    import com.sun.jna.Memory;
    import com.sun.jna.Native;
    import com.sun.jna.Pointer;
    import com.sun.jna.ptr.IntByReference;
    public class Cheater {
        static Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
        static User32 user32 = (User32) Native.loadLibrary("user32", User32.class);
        static int readRight = 0x0010;
        static int writeRight = 0x0020;
        //static int PROCESS_VM_OPERATION = 0x0008;
        public static void main(String[] args) {
            //Read Memory
            //MineSweeper = Campo Minado
            int pid = getProcessId("Campo Minado"); // get our process ID
            System.out.println("Pid = " + pid);
            Pointer readprocess = openProcess(readRight, pid); // open the process ID with read priviledges.
            Pointer writeprocess = openProcess(writeRight, pid);
            int size = 4; // we want to read 4 bytes
            int address = 0x004053C8;
            //Read Memory
            Memory read = readMemory(readprocess, address, size); // read 4 bytes of memory starting at the address 0x00AB0C62.
            System.out.println(read.getInt(0)); // print out the value!      
            //Write Memory
            int writeMemory = writeMemory(writeprocess, address, new short[0x22222222]);
            System.out.println("WriteMemory :" + writeMemory);
            Memory readM = readMemory(readprocess, address, size);
            System.out.println(readM.getInt(0));
        public static int writeMemory(Pointer process, int address, short[] data) {
            IntByReference written = new IntByReference(0);
            Memory toWrite = new Memory(data.length);
            for (long i = 0; i < data.length; i++) {
                toWrite.setShort(0, data[new Integer(Long.toString(i))]);
            boolean b = kernel32.WriteProcessMemory(process, address, toWrite, data.length, written);
            System.out.println("kernel32.WriteProcessMemory : " + b); // Retorna false
            return written.getValue();
        public static Pointer openProcess(int permissions, int pid) {
            Pointer process = kernel32.OpenProcess(permissions, true, pid);
            return process;
        public static int getProcessId(String window) {
            IntByReference pid = new IntByReference(0);
            user32.GetWindowThreadProcessId(user32.FindWindowA(null, window), pid);
            return pid.getValue();
        public static Memory readMemory(Pointer process, int address, int bytesToRead) {
            IntByReference read = new IntByReference(0);
            Memory output = new Memory(bytesToRead);
            kernel32.ReadProcessMemory(process, address, output, bytesToRead, read);
            return output;
    package com.br.HM;
    import com.sun.jna.Native;
    import com.sun.jna.Pointer;
    import com.sun.jna.Structure;
    import com.sun.jna.platform.win32.WinDef.RECT;
    import com.sun.jna.ptr.ByteByReference;
    import com.sun.jna.ptr.IntByReference;
    import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
    import com.sun.jna.win32.W32APIOptions;
    * Provides access to the w32 user32 library. Incomplete implementation to
    * support demos.
    * @author Todd Fast, [email protected]
    * @author [email protected]
    public interface User32 extends W32APIOptions {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS);
        Pointer GetDC(Pointer hWnd);
        int ReleaseDC(Pointer hWnd, Pointer hDC);
        int FLASHW_STOP = 0;
        int FLASHW_CAPTION = 1;
        int FLASHW_TRAY = 2;
        int FLASHW_ALL = (FLASHW_CAPTION | FLASHW_TRAY);
        int FLASHW_TIMER = 4;
        int FLASHW_TIMERNOFG = 12;
        public static class FLASHWINFO extends Structure {
            public int cbSize;
            public Pointer hWnd;
            public int dwFlags;
            public int uCount;
            public int dwTimeout;
        int IMAGE_BITMAP = 0;
        int IMAGE_ICON = 1;
        int IMAGE_CURSOR = 2;
        int IMAGE_ENHMETAFILE = 3;
        int LR_DEFAULTCOLOR = 0x0000;
        int LR_MONOCHROME = 0x0001;
        int LR_COLOR = 0x0002;
        int LR_COPYRETURNORG = 0x0004;
        int LR_COPYDELETEORG = 0x0008;
        int LR_LOADFROMFILE = 0x0010;
        int LR_LOADTRANSPARENT = 0x0020;
        int LR_DEFAULTSIZE = 0x0040;
        int LR_VGACOLOR = 0x0080;
        int LR_LOADMAP3DCOLORS = 0x1000;
        int LR_CREATEDIBSECTION = 0x2000;
        int LR_COPYFROMRESOURCE = 0x4000;
        int LR_SHARED = 0x8000;
        Pointer FindWindowA(String winClass, String title);
        int GetClassName(Pointer hWnd, byte[] lpClassName, int nMaxCount);
        public static class GUITHREADINFO extends Structure {
            public int cbSize = size();
            public int flags;
            Pointer hwndActive;
            Pointer hwndFocus;
            Pointer hwndCapture;
            Pointer hwndMenuOwner;
            Pointer hwndMoveSize;
            Pointer hwndCaret;
            RECT rcCaret;
        boolean GetGUIThreadInfo(int idThread, GUITHREADINFO lpgui);
        public static class WINDOWINFO extends Structure {
            public int cbSize = size();
            public RECT rcWindow;
            public RECT rcClient;
            public int dwStyle;
            public int dwExStyle;
            public int dwWindowStatus;
            public int cxWindowBorders;
            public int cyWindowBorders;
            public short atomWindowType;
            public short wCreatorVersion;
        boolean GetWindowInfo(Pointer hWnd, WINDOWINFO pwi);
        boolean GetWindowRect(Pointer hWnd, RECT rect);
        int GetWindowText(Pointer hWnd, byte[] lpString, int nMaxCount);
        int GetWindowTextLength(Pointer hWnd);
        int GetWindowModuleFileName(Pointer hWnd, byte[] lpszFileName, int cchFileNameMax);
        int GetWindowThreadProcessId(Pointer hWnd, IntByReference lpdwProcessId);
        interface WNDENUMPROC extends StdCallCallback {
             * Return whether to continue enumeration.
            boolean callback(Pointer hWnd, Pointer data);
        boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer data);
        boolean EnumThreadWindows(int dwThreadId, WNDENUMPROC lpEnumFunc, Pointer data);
        boolean FlashWindowEx(FLASHWINFO info);
        Pointer LoadIcon(Pointer hInstance, String iconName);
        Pointer LoadImage(Pointer hinst, // handle to instance
                String name, // image to load
                int type, // image type
                int xDesired, // desired width
                int yDesired, // desired height
                int load // load options
        boolean DestroyIcon(Pointer hicon);
        int GWL_EXSTYLE = -20;
        int GWL_STYLE = -16;
        int GWL_WNDPROC = -4;
        int GWL_HINSTANCE = -6;
        int GWL_ID = -12;
        int GWL_USERDATA = -21;
        int DWL_DLGPROC = 4;
        int DWL_MSGRESULT = 0;
        int DWL_USER = 8;
        int WS_EX_COMPOSITED = 0x20000000;
        int WS_EX_LAYERED = 0x80000;
        int WS_EX_TRANSPARENT = 32;
        int GetWindowLong(Pointer hWnd, int nIndex);
        int SetWindowLong(Pointer hWnd, int nIndex, int dwNewLong);
        int LWA_COLORKEY = 1;
        int LWA_ALPHA = 2;
        int ULW_COLORKEY = 1;
        int ULW_ALPHA = 2;
        int ULW_OPAQUE = 4;
        boolean SetLayeredWindowAttributes(Pointer hwnd, int crKey,
                byte bAlpha, int dwFlags);
        boolean GetLayeredWindowAttributes(Pointer hwnd,
                IntByReference pcrKey,
                ByteByReference pbAlpha,
                IntByReference pdwFlags);
         * Defines the x- and y-coordinates of a point.
        public static class POINT extends Structure {
            public int x, y;
         * Specifies the width and height of a rectangle.
        public static class SIZE extends Structure {
            public int cx, cy;
        int AC_SRC_OVER = 0x00;
        int AC_SRC_ALPHA = 0x01;
        int AC_SRC_NO_PREMULT_ALPHA = 0x01;
        int AC_SRC_NO_ALPHA = 0x02;
        public static class BLENDFUNCTION extends Structure {
            public byte BlendOp = AC_SRC_OVER; // only valid value
            public byte BlendFlags = 0; // only valid value
            public byte SourceConstantAlpha;
            public byte AlphaFormat;
        boolean UpdateLayeredWindow(Pointer hwnd, Pointer hdcDst,
                POINT pptDst, SIZE psize,
                Pointer hdcSrc, POINT pptSrc, int crKey,
                BLENDFUNCTION pblend, int dwFlags);
        int SetWindowRgn(Pointer hWnd, Pointer hRgn, boolean bRedraw);
        int VK_SHIFT = 16;
        int VK_LSHIFT = 0xA0;
        int VK_RSHIFT = 0xA1;
        int VK_CONTROL = 17;
        int VK_LCONTROL = 0xA2;
        int VK_RCONTROL = 0xA3;
        int VK_MENU = 18;
        int VK_LMENU = 0xA4;
        int VK_RMENU = 0xA5;
        boolean GetKeyboardState(byte[] state);
        short GetAsyncKeyState(int vKey);
    package com.br.kernel;
    import com.sun.jna.*;
    import com.sun.jna.win32.StdCallLibrary;
    import com.sun.jna.ptr.IntByReference;
    // by deject3d
    public interface Kernel32 extends StdCallLibrary
        // description from msdn
        //BOOL WINAPI WriteProcessMemory(
        //__in   HANDLE hProcess,
        //__in   LPVOID lpBaseAddress,
        //__in   LPCVOID lpBuffer,
        //__in   SIZE_T nSize,
        //__out  SIZE_T *lpNumberOfBytesWritten
        boolean WriteProcessMemory(Pointer p, int address, Pointer buffer, int size, IntByReference written);
        //BOOL WINAPI ReadProcessMemory(
        //          __in   HANDLE hProcess,
        //          __in   LPCVOID lpBaseAddress,
        //          __out  LPVOID lpBuffer,
        //          __in   SIZE_T nSize,
        //          __out  SIZE_T *lpNumberOfBytesRead
        boolean ReadProcessMemory(Pointer hProcess, int inBaseAddress, Pointer outputBuffer, int nSize, IntByReference outNumberOfBytesRead);
        //HANDLE WINAPI OpenProcess(
        //  __in  DWORD dwDesiredAccess,
        //  __in  BOOL bInheritHandle,
        //  __in  DWORD dwProcessId
        Pointer OpenProcess(int desired, boolean inherit, int pid);
        /* derp */
        int GetLastError();
    http://pastebin.com/Vq8wfy39

    Hello there,
    this tutorial was exactly what I needed, so thank you.
    Your problem seems to be in this line:
    int writeMemory = writeMemory(writeprocess, address, new short[0x22222222]); 
    The problem is, you're creating a new short array with the length of 0x22222222. Which not only results in an java.lang.OutOfMemoryError: Java heap space
    but also, if it would work, would create an empty array with the length of 0x22222222.
    I think you want to write 0x22222222 as value in your address.
    Correctly stored the code you'd need to write would be:
    short[] sarray = new short[]{(short) 0x22222222};
    But because the value is too long for the short, the value stored in your array would be the number 8738.
    I think, what you want to do is to store the number 572662306, which would be the hex value, stored in an int variable.
    So first of all you need to strip down your hex-value to shorts:
    Short in Java uses 16 Bit = 2 Byte. 0x22222222 -> 0x2222 for your high byte and 0x2222 for your low byte
    So your array would be
    short[] sarray = new short[]{0x2222,0x2222};//notice, that sarray[0] is the lowbyte and sarray[1] the high byte, if you want to store 20 it would be new short[]{20,0} or if you use hex new short[]{0x14,0x00}
    The next part is your writeToMemory Method. If I'm right, the method in the tutorial is a little bit wrong. The right version should be this:
    public static int writeMemory(Pointer process, int address, short[] data) {
      IntByReference written = new IntByReference(0);
      int size = data.length*Short.SIZE/8;
      Memory toWrite = new Memory(size);
      for (int i = 0; i < data.length; i++) {
      toWrite.setShort(i*Short.SIZE/8,
      data[i]);
      boolean b = kernel32.WriteProcessMemory(process, address, toWrite,
      size, written);
      return written.getValue();
    You need to calculate your offset right. And the size of your memory. Maybe you could write this method not with shorts, but with integers. But this should work.
    If you pass your new array to this function, it should write 0x22222222 to your adress. If you read out your toWrite value with toWrite.getInt(0) you get the right value.
    And there is one more thing. In order to write data to a process, you need to grant two access rights:
    A handle to the process memory to be modified. The handle must have PROCESS_VM_WRITE and PROCESS_VM_OPERATION access to the process.
    You have to grant the right to write data: PROCESS_VM_WRITE: 0x0020 and PROCESS_VM_OPERATION: 0x0008
    So your writeProcess needs to get initialized this way:
    Pointer writeprocess = openProcess(0x0020|0x0008,pid);
    I hope this works for you. Let me know.
    Greetings
    Edit:
    Because every data you write will be 1 byte to whatever count of byte I think the best way is to use the following method to write data to the memory:
    public static void writeMemory(Pointer process, long address, byte[] data)
      int size = data.length;
      Memory toWrite = new Memory(size);
      for(int i = 0; i < size; i++)
      toWrite.setByte(i, data[i]);
      boolean b = kernel32.WriteProcessMemory(process, address, toWrite, size, null);
    You can see some changes. First I changed all address values from int to long, because some addresses are out of range. And with all, i mean all. Not only in writeMemory, but also in readMemory and in your kernel32 Class.
    Second I don't use the IntByReference anymore..
    To use this method you need to store your data the following way if you would write 4 Byte data:
    byte[] values = new byte[]{0x14,0x00,0x00,0x00};
    This value would be the number 20. Index 0 will be the lowest byte and index 3 will be the highest byte.
    And one more thing I wrote is an method which you can use to calculate your address if you have a baseAddress.
    If you restart your program/game your old addresses won't point at the same values of your game. With some research (I use CheatEngine) you can get the baseaddress. This one will alway be the same.
    To get from your baseaddress to the dynamic adress you use offsets.
    public static long findDynAddy(Pointer process, int[] offsets, long baseAddress)
      long pointer = baseAddress;
      int size = 4;
      Memory pTemp = new Memory(size);
      long pointerAddress = 0;
      for(int i = 0; i < offsets.length; i++)
      if(i == 0)
      kernel32.ReadProcessMemory(process, pointer, pTemp, size, null);
      pointerAddress = ((pTemp.getInt(0)+offsets[i]));
      if(i != offsets.length-1)
      kernel32.ReadProcessMemory(process, pointerAddress, pTemp, size, null);
      return pointerAddress;
    This methods gets a process, an array of offsets (hex-values) and your baseadress and returns the dynamic address.
    For Solitaire the following code would give you the address to the score:
    long baseAddr = 0x10002AFA8L;
      int[] offsets = new int[]{0x50,0x14};
      long addr = findDynAddy(process, offsets, baseAddr);
    If somebody wants to get the whole code (user32, kernel32 and the cheater) just pm me and I will give you a link.

  • Write data to serial port every two minutes

    Hi,
       I use VISA-Write to write data to serial port. I want to write a byte every two minutes. What should I do?
      Thanks!

    hengfo,
    that question is not connected to LV nor to VISA. Its more a systematic question....
    So let's view at this a bit more abstract:
    You want to "toogle" between two different messages sent to your interface. So you have to know:
    - What was the last state i sent?
    - When do i have top send the new state?
    Even more abstract:
    - How can i switch between the states?
    Since the states are known before your program is executed, you can insert them into an array. Next, you have to read out the appropriate index from the array which contains your new state. Send the state and go to the next state. Propably you want to change timing, but that's easy too.
    See attached screenshot for a possible solution:
    hope this helps,
    NorbertMessage Edited by Norbert B on 09-11-2007 07:57 AM
    CEO: What exactly is stopping us from doing this?
    Expert: Geometry
    Marketing Manager: Just ignore it.
    Attachments:
    StateSwitching.PNG ‏8 KB

  • Servlet for writing Video bytes to response

    Hi there,
    Thanks to all who read this.
    I have developed an J2EE application that allows people to watch video and can see the application using mobile devices such as the iPhone.
    Videos for the iPhone are currently encoded in MP4 format and have been tested to work. When someone hits a video URL we have a Video servlet thats writes the bytes to the response. The code is given below:
    private void doGetAndPost(HttpServletRequest req, HttpServletResponse resp)
         // Get the URL up to the ? in the location
         logger.debug("doGetAndPost(HttpServletRequest, HttpServletResponse) - BEGIN");
         String requestURI = req.getRequestURI();
         String [] parts = requestURI.split("/");
         // Our filename is always the last item in our URI
         String filename = parts[parts.length-1];
         String trueFilePath  = Manager.getProperty(Manager.CLIP_DIRECTORY_KEY )  +"/"+  filename;
         logger.debug("doGetAndPost(HttpServletRequest, HttpServletResponse) - Getting file: "  +trueFilePath );
         String userAgent = req.getHeader("User-Agent").toLowerCase();
         String mimeType = "application/x-download";
         // if the user is browsing from a Blackberry we need to forward them to
         // the mobile view of things
         // All mobile views are a concatenation of the current views plus mobile such 'done' becomes 'doneMobile'
         if( userAgent.indexOf("blackberry") != - 1 || userAgent.indexOf("iphone") != - 1)
              mimeType="video/mp4";+
         else
                resp.setHeader("Content-Disposition", "attachment; filename="+  filename );
         try
              // Set the response for our download
              File file = new File(trueFilePath);
              int fileSize = (int)file.length();
              FileInputStream fis = new FileInputStream( file );
              resp.setContentType(mimeType);
              // Set the file size of the download....
              resp.addIntHeader("Content-Length", fileSize );
              resp.flushBuffer();
              OutputStream os = resp.getOutputStream();
              //write to out output stream
              while(true)
                        int bytedata = fis.read();
                        if (bytedata == -1)
                             break;
                        os.write(bytedata);
              // flush and close streams.....
              fis.close();
              os.flush();
              os.close();
         catch (FileNotFoundException e)
              logger.debug("doGetAndPost(HttpServletRequest, HttpServletResponse) - Unable to find file: " + trueFilePath, e );
         catch (IOException e)
              logger.debug("doGetAndPost(HttpServletRequest, HttpServletResponse) - Unable to get response output stream", e );
         logger.debug("doGetAndPost(HttpServletRequest, HttpServletResponse) - END");
    }This implementation is working fine for desktop browsers but when running it on a mobile device I hit a BrokenPipe SocketException.
    What I have noticed is that with mobile devices the servlet gets hit twice - seemingly once as the users selects the link and then the browser decides that it doesn't know what to do with that MIME type then it initialises its own internal media player then the servlet gets hit again to try and play the video.
    The broken pipe error seems to occur after the browser has decided it doesn't now how to handle the MIME type and thus any subsequent writes to the response/connection file.
    Has anyone experienced anything similar? Can anyone point out where I am going wrong?
    Many thanks in advance,
    Jimbobegg

    Besides the error message you log does it actually work in the mobile device or not?
    If it's working, then it works. The broken pipe simply means that the client is killing the socket unexpectedly. So...
    As an aside wrap a buffered stream around your file in. Reading a file byte by byte is needless and painful and slow.

Maybe you are looking for

  • Problem in opening MS Word doc from CRM back-end.

    Hi All: I have a MS Word document stored in my CRM system which opens by passing a transaction number as input. When we try to preview the word doc it opens properly from back-end. But the real problem exists when i'm trying to open it from my web-dy

  • G72-a40SA usb port not working

    Hi can anyone help me please? I have a HP G72-a40SA laptop running windows 7. The bios has been updated to the latest version. BUT, i cannot get one (out of three) usb ports to work. Its NOT being recognised by the PC. I have tried everything possibl

  • Custom ringtones are not staying

    For some reason, when I go to customize some of my contacts with specific ringtones, as well as linking contacts, my ENTIRE contact list reverts back to before I made the changes, and every contact gets reverted back to my default ringtone. I never h

  • Ical events not displaying correct time zone

    Hi All, I have a weird issue and I'm not sure if it's an iCal or an entourage problem. When one of our Entourage2008 (exchange) users sends a meeting invite to a user in a different time zone using ical, the meeting shows in ical as the time the ento

  • Shortcut in Spanish Keyboard

    Hi all, does anyone know how to increase/decrease size of adjustment brush in a Spanish keyboard? I know the short cut is ] / [ but in a Spanish keyboard to write down does symbols you have to press alt++ and alt+` and that doesn't work as increase/d