在 Java 中将整数视为布尔值

Sam*_*Sam 1 java boolean

我正在更新旧的 Java 应用程序以在现代操作系统上工作,但遇到了一个我无法弄清楚的错误。我对 Java 没有太多经验,但从我读过的内容来看,您不能像在 C++ 中那样将布尔值存储在整数(1 或 0)中。

这是错误所在的代码位:

  public static double a(cr paramcr, int paramInt) {
    double d = 0.0D;
    int i = ++b;
    if (b <= l.length()) {
      if (paramInt < 0) {
        int j = b; // <----------- defined again as an integer.
        d = e();
        if (e == true && d >= h && d + f - g >= 1.0D && d + f - g <= d) {
          String str1 = String.valueOf((int)d);
          d = d + f - g;
          String str2 = String.valueOf((int)d);
          l = a(j, l, str1, str2, i);
        } else if (j == false) { // <---------------------------- error
          if (((d < 1.0D || d > d) ? false : true) == false)
            c = 7; 
        }
Run Code Online (Sandbox Code Playgroud)

带有错误消息:

The operator == is undefined for the argument type(s) int, boolean
Run Code Online (Sandbox Code Playgroud)

变量 j 在程序顶部被定义为一个静态布尔值,但后来在这个 'a' 类中被重新定义为一个整数。我注意到还有其他整数变量用于与此类中的真假语句进行比较,但它们都与某些条件进行比较以获得真假结果。这显然不是这里的情况,我的问题是我想不出这个程序如果是这样编写的,它过去会运行的方式。关于为什么会这样的任何想法或对我下一步行动的建议?

这些都没有任何文档或直观的变量名称,这无济于事。

Ste*_*n C 5

在 Java 中,您不能将 anint视为boolean. 时期。

我收到了一些文件,有人告诉我其中包含源代码。它没。然后我被告知要反编译它。

您显然正在查看一些已从“.class”文件反编译的代码。不保证反编译会产生有效(可编译)的 Java 源代码。在这种情况下,它似乎没有。事实上,该代码中有一些线索暗示原始字节码被混淆了……故意使反编译器难以生成可读/有效的 Java 源代码。

(问题是使用相同的字节码来处理boolean和 整数类型int。在这种情况下,反编译器假定局部变量是int,并且无法确定它的假设是不正确的。更好的反编译器可能能够弄清楚......)

因此,您需要做的是弄清楚如何修改该(不是真正的 Java)代码以使其 1) 可编译,以及 2) 做正确的事情1

这些都没有任何文档或直观的变量名称,这无济于事。

嗯......当你尝试使用反编译代码时会发生什么。所有局部变量名和注释(包括javadocs)都被编译器丢弃,反编译器无法重建它们。

另一种选择是回到应该给你源代码的人那里,并要求他们提供给你......真的!


1 - 这假设您可以弄清楚该方法真正应该做什么。我不认为我们可以帮助你。首先,可能需要阅读反汇编的字节码才能弄清楚代码的真正作用。

  • 这是*混淆的*代码,而不仅仅是反编译的代码。如果可能的话,它的*意味着*在反编译时提供语法上无效的源代码。Sam 本质上是这里的(非常不幸的)黑帽。 (2认同)