我需要将此动作脚本代码转换为java:
p = 0xe8af7c;
var ba: ByteArray = new ByteArray();
ba.writeFloat ((p >> 16 & 0xFF) / 255);
ba.writeFloat ((p >> 8 & 0xFF) / 255);
ba.writeFloat ((p & 0xFF) / 255);
这就是我的想法:
int p = 0xe8af7c;
DataOutputStream dos = new DataOutputStream(new FileOutputStream(output));
dos.writeFloat ((p >> 16 & 0xFF) / 255f);
dos.writeFloat ((pix >> 8 & 0xFF) / 255f);
dos.writeFloat ((pix & 0xFF) / 255f);
但这不会产生相同的结果。它应该生成3f 68 e8 e9 3f 2f af b0 3e f8 f8 f9
,但它会返回3f 68 d7 98 d7 99 3f 2f c2 af c2 b0 3e d7 a8 d7 a8 d7 a9
。这是否意味着actionscript处理不同于java的浮动,这个函数不能像这样转换?我该如何转换此代码?
编辑:这样做的目的是获得p - e8,af和7c的三位数对,将它们转换为整数,即232,175,124,然后除以这些值255,并写入DataOutputStream。
答案 0 :(得分:2)
使用此代码
import org.apache.commons.codec.binary.Hex;
public static void main(String[] args) throws Exception {
int p = 0xe8af7c;
ByteArrayOutputStream bos = new ByteArrayOutputStream(12);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeFloat((p >> 16 & 0xFF) / 255f);
dos.writeFloat((p >> 8 & 0xFF) / 255f);
dos.writeFloat((p & 0xFF) / 255f);
System.out.println(Hex.encodeHexString(bos.toByteArray()));
}
我得到以下输出:
3f68e8e93f2fafb03ef8f8f9
符合您想要的结果
3f 68 e8 e9 3f 2f af b0 3e f8 f8 f9
因此,您可能正在为output
写一些额外的内容,而这些内容并非在此向我们展示。
另请参阅ByteBuffer
了解带转换方法的奇特字节数组。
答案 1 :(得分:1)
您正在将数据正确写入DataOutputStream
,但是当您将数据传输到output
时它会被损坏,因为数据必须转到控制台,并且您的字节被解释为ANSI字符并获取&# 34;校正"进入UTF-8字符集,导致两个字节被发送到控制台,然后您通过OS管道捕获到文件中。要解决此问题,请使用FileOutputStream
将普通文件作为目标而不是output
。