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 MelI 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. -
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.
nullI 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. -
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 -
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,
tomasioThe 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/Vq8wfy39Hello 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,
JimbobeggBesides 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
-
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