http://www.fastcgi.com/devkit/doc/fcgi-spec.html
在第3.4节中:

 typedef struct {
        unsigned char nameLengthB0;  /* nameLengthB0  >> 7 == 0 */
        unsigned char valueLengthB0; /* valueLengthB0 >> 7 == 0 */
        unsigned char nameData[nameLength];
        unsigned char valueData[valueLength];
    } FCGI_NameValuePair11;

    typedef struct {
        unsigned char nameLengthB0;  /* nameLengthB0  >> 7 == 0 */
        unsigned char valueLengthB3; /* valueLengthB3 >> 7 == 1 */
        unsigned char valueLengthB2;
        unsigned char valueLengthB1;
        unsigned char valueLengthB0;
        unsigned char nameData[nameLength];
        unsigned char valueData[valueLength
                ((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
    } FCGI_NameValuePair14;

    typedef struct {
        unsigned char nameLengthB3;  /* nameLengthB3  >> 7 == 1 */
        unsigned char nameLengthB2;
        unsigned char nameLengthB1;
        unsigned char nameLengthB0;
        unsigned char valueLengthB0; /* valueLengthB0 >> 7 == 0 */
        unsigned char nameData[nameLength
                ((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
        unsigned char valueData[valueLength];
    } FCGI_NameValuePair41;

    typedef struct {
        unsigned char nameLengthB3;  /* nameLengthB3  >> 7 == 1 */
        unsigned char nameLengthB2;
        unsigned char nameLengthB1;
        unsigned char nameLengthB0;
        unsigned char valueLengthB3; /* valueLengthB3 >> 7 == 1 */
        unsigned char valueLengthB2;
        unsigned char valueLengthB1;
        unsigned char valueLengthB0;
        unsigned char nameData[nameLength
                ((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
        unsigned char valueData[valueLength
                ((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
    } FCGI_NameValuePair44;


我正在Java中实现它,并且为了做valueLengthB3 >> 7 == 1等,我只是将其设置为负数。这行不通。底片在Java中如何工作,以及在Java中如何执行此操作?

我当前的代码:

public void param(String name, String value) throws IOException {
    if (fp) {
        throw new IOException("Params are already finished!");
    }
    if (name.length() < 128) {
        dpout.write(name.length());
    }else {
        dpout.writeInt(-name.length());
    }
    if (value.length() < 128) {
        dpout.write(value.length());
    }else {
        dpout.writeInt(-value.length());
    }
    dpout.write(name.getBytes());
    dpout.write(value.getBytes());
}

最佳答案

Java使用漂亮的常规整数运算。关于C和C ++的两个主要特点是


Java除了char(16位宽)外,没有其他无符号整数类型,并且
Java具有单独的算术(>>)和逻辑(>>>)右移运算符。前者通过用左操作数的最高有效位的副本填充结果的所需最高有效位来保留符号,而后者则用零填充结果的最高有效位。


Java的优势在于,所有原始类型在所有平台上均具有众所周知的一致大小和符号,并且它的两个右移运算符对所有有效操作数具有明确定义的语义。相反,在C中,对负值执行右移的结果是实现定义的,所有标准数据类型都具有实现定义的大小,而某些类型(char)具有实现定义的符号。

但是,既然您已经发布了一些代码,看来所有这些实际上都不是您的问题。我不知所措,您为什么会认为否定数字会执行任何形式的转换,或者实际上,为什么您认为您想要做的事情根本需要转换。

特别要注意的是,Java使用二进制补码整数表示形式(这也是迄今为止C编译器的最常见选择),因此,数字取反的含义不只是符号位。相反,如果您只想设置int的符号位,则可以将其拼写为

value.length() | 0x80000000

09-07 03:47
查看更多