Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用2';补语_Perl_Active Directory_Ldap - Fatal编程技术网

Perl 使用2';补语

Perl 使用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属性来计算大整数的值。正如您可

我正在尝试将AD
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位整数呃,你能发布准确的错误消息吗?