Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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访问字符_Perl_Winapi_Character Encoding - Fatal编程技术网

需要帮助解释字符串';使用perl访问字符

需要帮助解释字符串';使用perl访问字符,perl,winapi,character-encoding,Perl,Winapi,Character Encoding,这个输出(哪个字符集)是什么?我如何将它转换成有意义的东西 use Win32::API; $EnumProcesses= new Win32::API( 'psapi', 'EnumProcesses','PNP'); $aBuffer = " " x 4096; $bBuffer = " " x 4096; $EnumProcesses->Call($aBuffer,4096,$bBuffer); print $aBuffer,"\n",$bBuffer,"\n"; 您是否阅读

这个输出(哪个字符集)是什么?我如何将它转换成有意义的东西

use Win32::API;

$EnumProcesses= new Win32::API( 'psapi', 'EnumProcesses','PNP');

$aBuffer = " " x 4096;
$bBuffer = " " x 4096;

$EnumProcesses->Call($aBuffer,4096,$bBuffer);
print $aBuffer,"\n",$bBuffer,"\n";
您是否阅读了文档及其链接?看起来您根本没有处理字符数据。EnumProcesses使用N个4字节(或DWORD)记录填充
$abuffer
,每个进程一个记录。这个4字节的值只是一个数字,而不是4个字符

如果您想获得有关特定流程的更多信息,则需要将此4字节数字(在Win API文档中称为“流程标识符”)输入到诸如或PrintProcessNameAndID之类的函数中

下面的代码将结果显示为4字节小端数字:

use Modern::Perl; # strict, warnings, 5.10 features
use Win32::API;

my $EnumProcesses= new Win32::API( 'psapi', 'EnumProcesses','PNP');

my $process_ids_packed = " " x 4096;
my $num_processes_packed = " " x 4; # you don't need 4096 here.

$EnumProcesses->Call($process_ids_packed,4096,$num_processes_packed);

my ($num_processes) = unpack "V", $num_processes_packed;
my @process_ids = unpack "V$num_processes", $process_ids_packed;

for (@process_ids) {
    say;
}
结果如下:

C:\Users\pgp\Documents\src\tmp>perl winapi.pl
0
4
252
392
464
472
520
536
544
596
692
748
780
788
912
964
412
456
908
1116
1212
1228
1460
1492
1520
1528
1576
1724
1740
1748
1988
2028
312
2288
2544
2592
2756
3004
3116
3216
3340
3048
2792
1320
2868
3760
2404
4196
2692
4084
1768
538976288
538976288
538976288
538976288
538976288
 [... lots more lines ...]
538976288
538976288
538976288
538976288
538976288
538976288

这是最终结果

use strict;
use warnings;
use Win32::API; 

my $EnumProcesses = new Win32::API('psapi','EnumProcesses','PNP'); 
my $process_ids_packed = "\0" x 4096; 
my $num_processes_packed = "\0" x 4;  

$EnumProcesses->Call($process_ids_packed,4096,$num_processes_packed); 
my ($num_processes) = unpack "V", $num_processes_packed;

my $buffer = "\0" x $num_processes; #Allocate buffer of proper-size 
$EnumProcesses->Call($buffer,$num_processes,$num_processes_packed); 

print "Number of processes: ",$num_processes/4,"\n";

my @process_ids = unpack "V$num_processes", $buffer; 

for (@process_ids) { 
    print $_,"\n";
} 

谢谢大家

你想干什么?我这么问是因为在Win32 API上胡闹不适合胆小的人,而且可能有一个CPAN模块可以做你想做的事情而不必大惊小怪。我不认为解决这个问题的办法是使用另一个模块,伙计。显然,我正试图让Win32::API与perl一起工作;您正在尝试使用Win32::API执行某些操作。你的最终目标是什么?为什么要再打一次电话?您只需要调用它一次,就像在我的解决方案中一样。您的解决方案有一个固定的进程ID缓冲区。我的没有。这样做是为了实例化一个PID数组,该数组中没有“53976288”,也不受缓冲区的约束。@适航53976288位于缓冲区声明的有效部分。使用
解包“V$num\u进程”
仅从
$buffer
中提取
$num\u进程
项。如果有超过1024个进程,
$num_进程
仍将等于1024个(如文档所述),因此您不会获取比我的代码更多的进程。最后,每个进程需要4个字节,因此所需的空间是
$total\u number\u of\u processs*4
。此外,为了引起我的注意,请在您的评论开头添加@Philip;这会在我登录时ping我的收件箱。@Philip Potter我只是在寻找一种方法来删除5376288,避免陷入一种我获取的信息超过缓冲区容量的情况。老实说,我不认为我的代码符合后者。当缓冲区大于可用数据时,它执行前者。你能直接说代码吗?我不知道$total_number_进程是从哪里来的。当您提到$num_进程仍将等于1024时,您是否也在暗示其余信息将被忽略?谢谢