如何在JAVA中将二进制数据转换为字符串格式?

0lvr5msh  于 2022-09-17  发布在  Java
关注(0)|答案(11)|浏览(537)

大家好,
我目前正在开发一个从PC内存读取数据的应用程序。它正在工作,但输出如下:
(请参阅附件…)

输出不可读,它包含正方形、斜线、尖锐符号、字母、数字等。
这是什么格式的?这是二进制格式吗?
如何以可读或字符串格式打印?
请帮忙,
提前感谢,
马克·谭

qlzsbp2j

qlzsbp2j1#

它们是ASCII格式吗?
您可以在Java中将字节数组转换为字符串。
检查link中的各种字符串构造函数。
这可能对你有帮助。
当做
德拉杰·乔希

wko9yo5t

wko9yo5t2#

嗨,迪拉杰·乔希,
我不知道他们的格式是什么,我怎么知道?
顺便说一下,我会查一下你给的链接。。
谢谢。
马克·谭

vnzz0bqm

vnzz0bqm3#

我看不清楚附件。你能在这里张贴代码吗?
当做
德拉杰·乔希

4dbbbstv

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,缓冲大小);
返回新字符串(缓冲字节);
}

9q78igpj

9q78igpj5#

所有数据都是二进制的。ASCII只是一次解释8位(技术上是7位)数据的一种方式。ASCII还包含不可打印的字符。因此,你看到了一些奇怪的人物。这是因为它应用ASCII编码,数据恰好Map到ASCII集合中的不可打印字符。
表示数据的常用方法是将所有字节转换为十六进制表示。这并不能告诉你数据是什么,但你可以做出一些有根据的猜测。例如,如果它是64位长,则它可以是双精度或8字符ASCII编码字符串或2-8字符UTF-8编码字符串。

qyuhtwio

qyuhtwio6#

哦,我明白了。我将尝试开发一种将字节转换为十六进制的方法……谢谢!

wljmcqd8

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; 
    }   
}
jv2fixgn

jv2fixgn8#

谢谢,先生,这是一个很好的帮助!

rsaldnfx

rsaldnfx9#

嗨,黑暗之星21,
你的问题有解决方案吗。我得到了同样的问题,就像一个不可读的字符串。

vfh0ocws

vfh0ocws10#

您不需要自己将字节转换为十六进制,只需使用:

System.out.printf("%02X", byte);

或者在较旧的Java版本中:

System.out.print(String.format("%02X", byte))
ar5n3qh5

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(); 
    } 
  } 
}  

相关问题