【问题标题】:Bits representation of number String vs Integer in JavaJava中数字字符串与整数的位表示
【发布时间】:2021-08-25 18:17:21
【问题描述】:

字符串“12”的位表示为“00110001 00110010”,其中“00110001”表示 ASCII 值 49 表示“1”,“00110010”表示 ASCII 值 50 表示“2”。 这对于 String 来说看起来不错,但是如何将 12 的整数值转换为 Java 中的位? 如果两者都相同,那么Java将如何确定序列化后到达目标后的数据类型?

【问题讨论】:

  • 但是 12 的整数值如何转换为 Java 中的位? 那将是二进制的 1100。至于序列化,如果你在谈论特别是在 Java 中发生的序列化,那么你的想法太低了。它不会按位发生,它是通过构造对象并保存为特殊的“二进制”(不是“位感”)格式发生的
  • @g00se 但在 ASCII 12 中表示换页符。 java如何区分是整数12还是换页符?
  • 如果您尝试存储整数,则不应使用char c = 12
  • 这个问题是出于对数据如何表示的好奇,还是为了解决您面临的问题?
  • 按上下文。必须在 charCharacter 上下文中使用换页符。在某些情况下可能是String,但不是那么多

标签: java ascii bit


【解决方案1】:

整数不是 ASCII。数字的实际字符不会存储在任何地方

int x = 12int x = 0b1100 相同

不清楚您指的是什么序列化格式(但是,例如,Protobuf 会比 Java 默认的 ObjectInputStream 更好)或您遇到的具体错误。序列化框架本身应该在位位置编码字段边界,例如 - https://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html

【讨论】:

    【解决方案2】:

    Java 对象序列化通过写入额外的元数据来区分整数 12 和包含 (char)12 的字符串。

    例如,这里是ObjectOutputStream.writeString。如您所见,它写入一个常量字节TC_STRING(恰好定义为(byte)0x74)来表示后面的数据是一个字符串:

    private void writeString(String str, boolean unshared) throws IOException {
        handles.assign(unshared ? null : str);
        long utflen = bout.getUTFLength(str);
        if (utflen <= 0xFFFF) {
            bout.writeByte(TC_STRING);
            bout.writeUTF(str, utflen);
        } else {
            bout.writeByte(TC_LONGSTRING);
            bout.writeLongUTF(str, utflen);
        }
    }
    

    阅读器然后可以读取一个字节,检查它是否是TC_STRING,如果是,它就知道后面的数据是一个字符串,而不是一个整数或其他任何东西。

    【讨论】:

      【解决方案3】:

      ASCII is 字符编码标准,将字符映射到代码点。

      '1'是一个字符,'2'是一个字符,'a'是一个字符,'?'也是一个字符..

      然而,

      12 是一个数字,没有映射到任何代码点。

      您可以将整数转换为其二进制字符串表示形式:

      int x = 12;
      String bx = Integer.toBinaryString(x);
      

      System.out.println(bx);
      

      将打印1100,即十进制的12

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-01
        • 2019-09-19
        • 2014-12-15
        • 1970-01-01
        相关资源
        最近更新 更多