+-
我正在尝试从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下的显示匹配.但是,我的编码如下(每天的位字符串)
Sun: 00000000 (00) 00000000 (00) 00000000 (00)
Mon-Fri: 00001111 (0F) 11111111 (FF) 11111000 (F8)
Sat: 00000000 (00) 11111111 (FF) 11000000 (C0)
这使我认为logonHours属性和显示之间发生了一些编码.我看过Perl代码和VBScript-在Java中转换这两种代码都会进行直接转换,这与实际情况不符.
是否有人拥有Java,C#.NET或其他伪代码来正确解码logonHours属性?
最佳答案
当我举起双手并寻求帮助十分钟后,我想出这些东西时,我讨厌它.关键在此页中: Active Directory Permitted Logon Times with C# .Net 3.5 using System.DirectoryServices.AccountManagement-具体来说,位的排序以及数组以1比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();
}
点击查看更多相关文章
转载注明原文:如何在Java中解码logonHours属性 - 乐贴网