Perl 使用2';补语
我正在尝试将ADPerl 使用2';补语,perl,active-directory,ldap,Perl,Active Directory,Ldap,我正在尝试将ADmaxpwdAge(64位整数)转换为天数 : 使用IADs接口的Get方法检索域的maxPwdAge属性的值(第5行) 请注意,我们在VBScript中使用Set关键字来初始化名为objMaxPwdAge的变量,该变量用于存储Get返回的值。为什么呢 获取64位大整数时,ADSI不会返回一个巨大的标量值。相反,ADSI会自动返回一个IADsLargeInteger对象。您可以使用IADsLargeInteger接口的HighPart和LowPart属性来计算大整数的值。正如您可
maxpwdAge
(64位整数)转换为天数
:
使用IADs接口的Get
方法检索域的maxPwdAge
属性的值(第5行)
请注意,我们在VBScript中使用Set
关键字来初始化名为objMaxPwdAge
的变量,该变量用于存储Get
返回的值。为什么呢
获取64位大整数时,ADSI不会返回一个巨大的标量值。相反,ADSI会自动返回一个IADsLargeInteger
对象。您可以使用IADsLargeInteger
接口的HighPart
和LowPart
属性来计算大整数的值。正如您可能猜到的,HighPart
获取高阶32位,LowPart
获取低阶32位。使用以下公式将HighPart
和LowPart
转换为大整数的值
同一页中VBScript中的现有代码:
我如何在Perl中做到这一点?可能会涉及到这一点,但您可能会说
#!/usr/bin/perl
use strict;
use warnings;
my $num = -37_108_517_437_440;
my $binary = sprintf "%064b", $num;
my ($high, $low) = $binary =~ /(.{32})(.{32})/;
$high = oct "0b$high";
$low = oct "0b$low";
my $together = unpack "q", pack "LL", $low, $high;
print "num $num, low $low, high $high, together $together\n";
可能会涉及到这件事,但你可以说
#!/usr/bin/perl
use strict;
use warnings;
my $num = -37_108_517_437_440;
my $binary = sprintf "%064b", $num;
my ($high, $low) = $binary =~ /(.{32})(.{32})/;
$high = oct "0b$high";
$low = oct "0b$low";
my $together = unpack "q", pack "LL", $low, $high;
print "num $num, low $low, high $high, together $together\n";
我错过什么了吗?从你的问题中我可以看出,你的问题与2的补码完全无关。据我所知,你所需要/想要做的就是
use Math::BigInt;
use constant MAXPWDAGE_UNIT_PER_SEC => (
1000 # milliseconds
* 1000 # microseconds
* 10 # 100 nanoseconds
);
use constant SECS_PER_DAY => (
24 # hours
* 60 # minutes
* 60 # seconds
);
my $maxpwdage_full = ( Math::BigInt->new( $maxpwdage_highpart ) << 32 ) + $maxpwdage_lowpart;
my $days = $maxpwdage_full / MAXPWDAGE_UNIT_PER_SEC / SECS_PER_DAY;
使用Math::BigInt;
使用常数MAXPWDAGE\u UNIT\u PER\u SEC=>(
1000毫秒
*1000微秒
*10#100纳秒
);
每天使用恒定秒数=>(
24小时
*60分钟
*60秒
);
我的$maxpwdage_full=(Math::BigInt->new($maxpwdage_highpart)我遗漏了什么吗?从你的问题中我可以看出,你的问题与2的补码无关。据我所知,你需要/想要做的就是
use Math::BigInt;
use constant MAXPWDAGE_UNIT_PER_SEC => (
1000 # milliseconds
* 1000 # microseconds
* 10 # 100 nanoseconds
);
use constant SECS_PER_DAY => (
24 # hours
* 60 # minutes
* 60 # seconds
);
my $maxpwdage_full = ( Math::BigInt->new( $maxpwdage_highpart ) << 32 ) + $maxpwdage_lowpart;
my $days = $maxpwdage_full / MAXPWDAGE_UNIT_PER_SEC / SECS_PER_DAY;
使用Math::BigInt;
使用常数MAXPWDAGE\u UNIT\u PER\u SEC=>(
1000毫秒
*1000微秒
*10#100纳秒
);
每天使用恒定秒数=>(
24小时
*60分钟
*60秒
);
我的$maxpwdage_full=(Math::BigInt->new($maxpwdage_highpart)ya..它会,但如何生成高部分和低部分(例如:值为-37108517437440)我以为你有高32位和低32位部分,想构建原始的64位值。你有什么?我有64位单整数:-37108517437440你想要什么?高32位和低32位?在Perl 5.8.8中,q
模板是有效的:可能是你使用的Perl的32位版本不能保存64位整数呃,你能发布准确的错误消息吗?是的,但是如何生成高部分和低部分(例如:值为-37108517437440)我以为你有高32位和低32位部分,想构建原始的64位值。你有什么?我有64位单整数:-37108517437440你想要什么?高32位和低32位?在Perl 5.8.8中,q
模板是有效的:可能是你使用的Perl的32位版本不能保存64位整数呃,你能发布准确的错误消息吗?