【问题标题】:Java doesnt accept unsigned bytes, and i am trying to map themJava 不接受无符号字节,我正在尝试映射它们
【发布时间】:2019-04-26 23:57:41
【问题描述】:

我需要映射 2 个字节,这样如果起始位置(或以字节编码的 rgb 颜色)以 255(或 127 以上的任何值)开始,并且它需要以 0 结束,在一行例如 30 段。数学很简单:您只需制作 ((0-255*segment)/30)(255-0) ,对于每个段,您将拥有更少的字节。这只是线性混合的数学 无论如何,其他语言有一个叫做 map 的函数可以做到这一点。 Example of Map in C++ 但问题是我在java中需要这个功能。所以我决定自己做。原因是因为我需要将颜色从一侧混合到另一侧。所以我做了这个简单的应用程序,但它不起作用,因为当计算的字节数超过 127 时,java 认为它的值低于起点。 代码在这里。第一个函数是尝试淡出的java方法,第二个函数是尝试进行映射计算的函数:

public ColorRGB[] olas(ColorRGB color1, ColorRGB color2) {          
    ColorRGB[] colordevuelto=new ColorRGB[30];
    byte longuitud=30;  
    //so we get two colors and fade and merge them at some point
    for(byte h=0;h<longuitud;h++) {
        byte rojofinal= map(color1.getRed(),color2.getRed(),(byte) 0,longuitud,h);  
        byte azulfinal= map(color1.getBlue(),color2.getBlue(),(byte) 0,longuitud,h);
        byte verdefinal= map(color1.getGreen(),color2.getGreen(),(byte) 0,longuitud,h);
        System.out.println("Led num: "+h+"Componente roja: "+ Byte.toString(rojofinal)+" componente verde: "+Byte.toString(verdefinal)+" componente azul "+Byte.toString(azulfinal));
        colordevuelto[h]=new ColorRGB(rojofinal,verdefinal,azulfinal);
    }
    return colordevuelto;   //devuelve un array de color fadeado a lo largo de 30 pixeles
}
private byte map (byte xinicio, byte xfinal,byte ymin,byte ymax, byte point) {
    //this funtion is for mapping from one side to another
    if(point > ymax || point <ymin) {
        return 0;   //Esto no deberia pasar nunca
    }

    if(xfinal>xinicio) {
        return (byte) (((xfinal-xinicio)*point)/(ymax-ymin));
    }
    else {
        return (byte) (((xfinal-xinicio)*point)/(ymax-ymin)+(xinicio-xfinal));
    }


}

【问题讨论】:

  • 什么是 ColorRGB?能贴出它的代码吗?
  • @Eugene 好的,谢谢。
  • 我不太明白你的问题,但是为什么不使用 16 位的 char,或者如果你真的要使用带有掩码的 int
  • 要将字节 b 转换为 0-255 值,您可以执行 b &amp; 0xFF 现在它是一个无符号字节(实际上它是一个 int,但具有无符号字节的范围)
  • @PeterLawrey 可能会回答这个问题,我真的很懒惰,我会投票赞成

标签: java dictionary byte unsigned


【解决方案1】:

虽然语言对无符号字节的支持会很好,可能比有符号字节更好,但您可以很容易地将一个字节转换为另一个。

byte b = // some signed value
int unsigned = b & 0xFF;

简而言之,将所有计算作为int 值进行,并且只转换为一个字节以进行存储或兼容性。

由于您可能混合大量像素,您甚至可以使用floatdouble 进行计算,并在需要时转换为字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多