gpt4 book ai didi

c# - 在 Java 中对 "signed"数据执行按位左移——更好地转移到 JNI?

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:52 28 4
gpt4 key购买 nike

在过去的一周里,我一直在询问有关十六进制和按位操作(这里和其他地方)的问题,试图围绕它们在 Java 中的表示。经过多次谷歌搜索和懊恼之后,我必须最后问一次如何对本应无符号但在 Java 中表示为有符号的位执行逻辑算术。

好的:我正在将 C# 程序移植到 Java。该程序处理位图操作,因此应用程序中的大部分数据都表示为 byte,这是一个无符号的 8 位整数。有许多建议改为使用 Java 中的 short 数据类型,以便尽可能“模仿”无符号 8 字节整数。

我认为这对我来说是不可能的,因为 C# 代码正在对我的字节数据执行各种移位和 AND 操作。例如,如果 data 是一个字节数组,并且此代码块存在于 C# 中:

int cmdtype = data[pos] >> 5;
int len = (data[pos] & 0x1F) + 1;

if (cmdtype == 7)
{
cmdtype = (data[pos] & 0x1C) >> 2;
len = ((data[pos] & 3) << 8) + data[pos + 1] + 1;
pos++;
}

仅仅将 data 转换为 short 并完成它以使其在 Java 中工作并不是一件简单的事情。就逻辑而言,我的数据保持 8 位无符号的要求很重要; 16 位无符号会像上面那样搞砸数学。我在这里吗?事实上,在之前使用 Java 中的 0XFFchar 进行“伪造”byte 而没有得到正确的结果之后,恐怕我遇到了死胡同。

现在,在代码的另一部分,我正在执行一些位图像素操作。由于这是一个长时间运行的过程,我决定通过 JNI 调用 native 代码。我最近意识到我可以在那里使用 uint8_t 数据类型并获得最接近 C# byte 数据类型的表示。

是否有使我的所有数据相关功能都在 JNI 中运行的解决方案?这似乎非常低效,无论是重写还是执行。解决方案是在 Java 中重做数学以使逻辑保持不变吗?这似乎是对的,但有可能诱发动脉瘤,更不用说错误的数学了。

我感谢所有建议。

最佳答案

请注意:您不能直接转换为 short,因为负数会在逻辑上被扩展。

即字节 1111 1101 (-5) 直接转换为 short 将导致 1111 1111 1111 1101 (-5 ),而不是 0000 0000 1111 1101 (253)。您必须在转换时使用 AND 操作删除前导:

short shortValue = ((short)(byteValue)) & 0xFF;

我知道像这样的复杂位操作是可能的,因为我在使用 Java Swing 应用程序处理遗留二进制消息传递协议(protocol)时已经完成了这件事。我强烈建议以某种方式将其抽象化,这样您只需处理一次。这是否意味着将您的“字节”包装在一个类中以将它们存储为短裤并处理转换操作,或者定义一个静态实用程序来一次完成转换和位操作,以便您始终存储字节。

关于c# - 在 Java 中对 "signed"数据执行按位左移——更好地转移到 JNI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4199294/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com