如何在Java中解码logonHours属性

如何在Java中解码logonHours属性,java,active-directory,Java,Active Directory,我试图从Active Directory中解码logonHours属性,以便它正确地显示在Java应用程序中。当我在属性编辑器中查看时,它如下所示: logonHours 03 00 00 00 F0 FF 1F F0 FF 1F F0 FF 1F F0 FF 1F F0 FF 1F 00 FF 这正好是21字节长,这是我所期望的(每天用3字节编码,每天总共24位)。这是为了匹配我在logonHours下的显示。但是,我的编码如下(每天的位字符串) 这使我认为logonHours属性和显示之间

我试图从Active Directory中解码logonHours属性,以便它正确地显示在Java应用程序中。当我在属性编辑器中查看时,它如下所示:

logonHours 03 00 00 00 F0 FF 1F F0 FF 1F F0 FF 1F F0 FF 1F F0 FF 1F 00 FF
这正好是21字节长,这是我所期望的(每天用3字节编码,每天总共24位)。这是为了匹配我在logonHours下的显示。但是,我的编码如下(每天的位字符串)

这使我认为logonHours属性和显示之间发生了一些编码。我已经看过了Perl代码和VBScript,在Java中转换它们中的任何一个都会直接进行转换,这与实际情况不符


有人有Java、C#.NET或其他伪代码来正确解码logonHours属性吗?

我讨厌在我举手请求帮助十分钟后才弄明白这些事情。关键在于本页:-具体而言,是位的顺序以及阵列以off-by-1问题开始的事实。下面是我提出的Java代码:

private String[] decodeLogonHours(Attribute attr)
{
    byte[] raw = attr.getValueByteArray();
    String[] days = new String[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    ArrayList<String> ret = new ArrayList<String>();

    for (int day = 0 ; day < days.length ; day++) {
        byte[] vBits;
        if (day == 6) {
            vBits = new byte[] { raw[19], raw[20], raw[0] };
        } else {
            vBits = new byte[] { raw[day*3+1], raw[day*3+2], raw[day*3+3] };
        }

        StringBuffer sb = new StringBuffer();
        sb.append(String.format("%s:", days[day]));
        for (int b = 0 ; b < 3 ; b++) {
            sb.append(" ");
            sb.append(decodeLogonBits(vBits[b]));
        }
        ret.add(sb.toString());
    }

    String[] r = new String[ret.size()];
    ret.toArray(r);
    return r;
}

private String decodeLogonBits(byte b) {
    StringBuffer sb = new StringBuffer();
    sb.append((b & 0x01) > 0 ? "1" : "0");
    sb.append((b & 0x02) > 0 ? "1" : "0");
    sb.append((b & 0x04) > 0 ? "1" : "0");
    sb.append((b & 0x08) > 0 ? "1" : "0");
    sb.append((b & 0x10) > 0 ? "1" : "0");
    sb.append((b & 0x20) > 0 ? "1" : "0");
    sb.append((b & 0x40) > 0 ? "1" : "0");
    sb.append((b & 0x80) > 0 ? "1" : "0");
    return sb.toString();
}
private String[]decodeLogonHours(属性attr)
{
字节[]原始=attr.getValueByteArray();
字符串[]天=新字符串[]{“Sun”、“Mon”、“Tue”、“Wed”、“Thu”、“Fri”、“Sat”};
ArrayList ret=新的ArrayList();
对于(int day=0;day0?“1”:“0”);
sb.追加((b&0x02)>0?“1”:“0”);
sb.追加((b&0x04)>0?“1”:“0”);
sb.追加((b&0x08)>0?“1”:“0”);
sb.追加((b&0x10)>0?“1”:“0”);
sb.追加((b&0x20)>0?“1”:“0”);
sb.追加((b&0x40)>0?“1”:“0”);
sb.追加((b&0x80)>0?“1”:“0”);
使某人返回字符串();
}
getValueByteArray()方法;这里提到的不存在。有人能推荐一个替代方法吗?这可能会有帮助:-基本上,他们不赞成该方法-您可以使用get()将值作为对象获取,然后手动转换为字节数组。
private String[] decodeLogonHours(Attribute attr)
{
    byte[] raw = attr.getValueByteArray();
    String[] days = new String[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    ArrayList<String> ret = new ArrayList<String>();

    for (int day = 0 ; day < days.length ; day++) {
        byte[] vBits;
        if (day == 6) {
            vBits = new byte[] { raw[19], raw[20], raw[0] };
        } else {
            vBits = new byte[] { raw[day*3+1], raw[day*3+2], raw[day*3+3] };
        }

        StringBuffer sb = new StringBuffer();
        sb.append(String.format("%s:", days[day]));
        for (int b = 0 ; b < 3 ; b++) {
            sb.append(" ");
            sb.append(decodeLogonBits(vBits[b]));
        }
        ret.add(sb.toString());
    }

    String[] r = new String[ret.size()];
    ret.toArray(r);
    return r;
}

private String decodeLogonBits(byte b) {
    StringBuffer sb = new StringBuffer();
    sb.append((b & 0x01) > 0 ? "1" : "0");
    sb.append((b & 0x02) > 0 ? "1" : "0");
    sb.append((b & 0x04) > 0 ? "1" : "0");
    sb.append((b & 0x08) > 0 ? "1" : "0");
    sb.append((b & 0x10) > 0 ? "1" : "0");
    sb.append((b & 0x20) > 0 ? "1" : "0");
    sb.append((b & 0x40) > 0 ? "1" : "0");
    sb.append((b & 0x80) > 0 ? "1" : "0");
    return sb.toString();
}