大家好,我目前正在开发一个从PC内存读取数据的应用程序。它正在工作,但输出如下:(请参阅附件…)
输出不可读,它包含正方形、斜线、尖锐符号、字母、数字等。这是什么格式的?这是二进制格式吗?如何以可读或字符串格式打印?请帮忙,提前感谢,马克·谭
qlzsbp2j1#
它们是ASCII格式吗?您可以在Java中将字节数组转换为字符串。检查link中的各种字符串构造函数。这可能对你有帮助。当做德拉杰·乔希
wko9yo5t2#
嗨,迪拉杰·乔希,我不知道他们的格式是什么,我怎么知道?顺便说一下,我会查一下你给的链接。。谢谢。马克·谭
vnzz0bqm3#
我看不清楚附件。你能在这里张贴代码吗?当做德拉杰·乔希
4dbbbstv4#
输出如下:运行:Yahoo!信使:66892雅虎的进程ID!信使:4252h过程:native@0x278操作已成功完成。数据:�����HTML无法在浏览器上正确显示。。这是我用来从内存中获取数据的代码:公共字符串getMemoryData(int-ProcessId、int-bufferSize、int-offset、指针hProcess){IntByReference baseAddress=新的IntByRefernce();baseAddress.setValue(偏移量);内存输出缓冲区=新内存(缓冲区大小);boolean success=kernel32.ReadProcessMemory(hProcess、offset、outputBuffer、bufferSize、null);byte[]bufferBytes=outputBuffer。getByteArray(0,缓冲大小);返回新字符串(缓冲字节);}
9q78igpj5#
所有数据都是二进制的。ASCII只是一次解释8位(技术上是7位)数据的一种方式。ASCII还包含不可打印的字符。因此,你看到了一些奇怪的人物。这是因为它应用ASCII编码,数据恰好Map到ASCII集合中的不可打印字符。表示数据的常用方法是将所有字节转换为十六进制表示。这并不能告诉你数据是什么,但你可以做出一些有根据的猜测。例如,如果它是64位长,则它可以是双精度或8字符ASCII编码字符串或2-8字符UTF-8编码字符串。
qyuhtwio6#
哦,我明白了。我将尝试开发一种将字节转换为十六进制的方法……谢谢!
wljmcqd87#
像这样的东西应该对你有好处,伙计。。。
public class BytesToHex { private byte[] inbytes; private String hexString=""; public BytesToHex(byte[] inbytes){ this.inbytes = inbytes; } public String toHex() { String subString; int i; for (byte b: inbytes){ subString =""; i = (int)b & 0xff ; subString = Integer.toHexString(i); if (subString.length()==1){ subString = "0" +subString; } this.hexString += subString + " "; } return hexString; } }
jv2fixgn8#
谢谢,先生,这是一个很好的帮助!
rsaldnfx9#
嗨,黑暗之星21,你的问题有解决方案吗。我得到了同样的问题,就像一个不可读的字符串。
vfh0ocws10#
您不需要自己将字节转换为十六进制,只需使用:
System.out.printf("%02X", byte);
或者在较旧的Java版本中:
System.out.print(String.format("%02X", byte))
ar5n3qh511#
尝试以下代码
import java.io.*; import java.nio.channels.*; import javax.xml.bind.DatatypeConverter; public class EncodeDecode { public static void main(String[] args) throws Exception { File file = new File("/bin/ls"); byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray(); String encoded = DatatypeConverter.printBase64Binary(bytes); System.out.println(encoded); byte[] decoded = DatatypeConverter.parseBase64Binary(encoded); // check for (int i = 0; i < bytes.length; i++) { assert bytes[i] == decoded[i]; } } private static <T extends OutputStream> T loadFile(File file, T out) throws IOException { FileChannel in = new FileInputStream(file).getChannel(); try { assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out)); return out; } finally { in.close(); } } }
11条答案
按热度按时间qlzsbp2j1#
它们是ASCII格式吗?
您可以在Java中将字节数组转换为字符串。
检查link中的各种字符串构造函数。
这可能对你有帮助。
当做
德拉杰·乔希
wko9yo5t2#
嗨,迪拉杰·乔希,
我不知道他们的格式是什么,我怎么知道?
顺便说一下,我会查一下你给的链接。。
谢谢。
马克·谭
vnzz0bqm3#
我看不清楚附件。你能在这里张贴代码吗?
当做
德拉杰·乔希
4dbbbstv4#
输出如下:
运行:
Yahoo!信使:66892
雅虎的进程ID!信使:4252
h过程:native@0x278
操作已成功完成。
数据:�����
HTML无法在浏览器上正确显示。。
这是我用来从内存中获取数据的代码:
公共字符串getMemoryData(int-ProcessId、int-bufferSize、int-offset、指针hProcess){
IntByReference baseAddress=新的IntByRefernce();
baseAddress.setValue(偏移量);
内存输出缓冲区=新内存(缓冲区大小);
boolean success=kernel32.ReadProcessMemory(hProcess、offset、outputBuffer、bufferSize、null);
byte[]bufferBytes=outputBuffer。getByteArray(0,缓冲大小);
返回新字符串(缓冲字节);
}
9q78igpj5#
所有数据都是二进制的。ASCII只是一次解释8位(技术上是7位)数据的一种方式。ASCII还包含不可打印的字符。因此,你看到了一些奇怪的人物。这是因为它应用ASCII编码,数据恰好Map到ASCII集合中的不可打印字符。
表示数据的常用方法是将所有字节转换为十六进制表示。这并不能告诉你数据是什么,但你可以做出一些有根据的猜测。例如,如果它是64位长,则它可以是双精度或8字符ASCII编码字符串或2-8字符UTF-8编码字符串。
qyuhtwio6#
哦,我明白了。我将尝试开发一种将字节转换为十六进制的方法……谢谢!
wljmcqd87#
像这样的东西应该对你有好处,伙计。。。
jv2fixgn8#
谢谢,先生,这是一个很好的帮助!
rsaldnfx9#
嗨,黑暗之星21,
你的问题有解决方案吗。我得到了同样的问题,就像一个不可读的字符串。
vfh0ocws10#
您不需要自己将字节转换为十六进制,只需使用:
或者在较旧的Java版本中:
ar5n3qh511#
尝试以下代码