【问题标题】:Java hexadecimal velue convert to ascii and back to hexadecimal goes wrongJava 十六进制值转换为 ascii 并返回十六进制出错
【发布时间】:2018-12-06 10:52:11
【问题描述】:

我做了一个小项目,将十六进制字符串转换为 ASCII 字符串。当我转换 te 值时,我将其发送给客户。但是我的客户没有重新考虑这个值。

我搜索了原因,发现当我将 ASCII 字符串转换回十六进制时,我得到了一点点差值。所以我认为当我发送数据时出了点问题。但我没有没有如何解决我的问题..

我还尝试先将十六进制转换为 dec,然后再转换为 ascii,我也尝试了更多的 noob whay,只需发送一个命令,例如:

char p = 3;
char d = 4;

bw3.write(p + "" + c + ""); 

所以这是我现在得到的代码:

  ServerSocket welcomeSocket2 = new ServerSocket(9999);
   Socket socket2 = welcomeSocket2.accept();  
   OutputStream os3 = socket2.getOutputStream();
   OutputStreamWriter osw3 = new OutputStreamWriter(os3);
   BufferedWriter bw3 = new BufferedWriter(osw3);




 String hex4 = "00383700177a0102081c4200000000000001a999c338030201000a080000000000000000184802000007080444544235508001000002080104";

   StringBuilder output4 = new StringBuilder();
   for (int i =0; i< hex4.length(); i +=2){
       String str4 = hex4.substring(i, i+2);
       int outputdecimal = Integer.parseInt(str4,16);
       char hexchar = (char)outputdecimal;
       System.out.println(str4);
       output4.append(hexchar);
   }

  bw3.write(output4.toString());
   bw3.flush();

我还注意到,当我发送一个只有 4 个字节长或 10 个字节长的命令时,一切都很顺利。我收到了转换后的 ascii 代码。我现在想要发送的命令是 58 字节长。

【问题讨论】:

    标签: java char hex ascii


    【解决方案1】:

    ASCII 不能代表所有可能的十六进制数据。

    因此,只要您尝试将您的 hexa 转换为 ASCII,您尝试的任何方法都不会奏效。

    您的十六进制包含纯二进制、计算机-y 不透明数据。 ASCII 是用来表示文本的。有一些二进制数据是由 ASCII 组成的,因此可以用 ASCII 表示。除了这些数据之外,还有所有其他数据。当您尝试将十六进制转换为 ASCII 时,这些总是会出错。这仅仅是因为 ASCII 无法做到这一点,就其本身的定义而言。

    【讨论】:

    • 但是如果我只发送一个 10 字节长的值,一切正常,为什么会这样?因为你对我说,如果我将十六进制转换为 ascii,我尝试什么都行不通,但其他较小的命令确实有效,我也尝试将十进制转换为 ascii,通常你可以在 ascii 中转换 0 - 255
    • @metalgastje 因为您偶然选择了一个完全由 ASCII 组成的 10 字节长的数据块。这些事情发生时,ASCII 在计算机中无处不在。但是,ASCII 并不是所有数据的组成部分,因此在它不起作用的情况下,您一定会经常运行。
    • 好的,但是我拥有的十六进制字符串可以转换为 ascii , 00 - ascii 00 , 38 --> 8 ,所以我不明白为什么当我从ascii 到 hex ,而且,如果 ascii 不起作用,我会输入大多数我的数据然后发送?
    • 你拥有的十六进制字符串是放在变量 hex4 中的吗?因为它无法转换为 ASCII。它包含字节 a9,值 169,字节 99,值 153,字节 c3,值 195 和字节 80,值 128。所有这些都与 ASCII 不兼容,ASCII 定义了值 0 到 127 的字符,仅此而已。
    • 但是你也可以得到扩展的 ascii 吗?到 255
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2012-11-14
    • 2020-11-20
    • 2017-10-06
    相关资源
    最近更新 更多