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-从位于两个(16位)字段之间的位(跨越字边界的数据)形成值_Perl_Vector_Bit Shift_Pack_Unpack - Fatal编程技术网

Perl-从位于两个(16位)字段之间的位(跨越字边界的数据)形成值

Perl-从位于两个(16位)字段之间的位(跨越字边界的数据)形成值,perl,vector,bit-shift,pack,unpack,Perl,Vector,Bit Shift,Pack,Unpack,我正在将一些数据读入16位数据字,并从16位数据字的部分中提取值。我需要的一些值跨越了单词边界 我需要从第一个单词中提取位,从第二个单词中提取一些位,并将它们连接起来形成一个值 我在想最好的办法。我可以到处移动数据,并以这种方式组合数据,但我认为可能会有一种更简单/更好的方法,因为我有很多这样的情况,并且在某些情况下,值的大小不同(我知道,因为我有一个数据图) 例如: [TTTTTDDDDPPPPYYY] - 16 bit field [YYYYYWWWWWQQQQQQ] - 16 bit f

我正在将一些数据读入16位数据字,并从16位数据字的部分中提取值。我需要的一些值跨越了单词边界

我需要从第一个单词中提取位,从第二个单词中提取一些位,并将它们连接起来形成一个值

我在想最好的办法。我可以到处移动数据,并以这种方式组合数据,但我认为可能会有一种更简单/更好的方法,因为我有很多这样的情况,并且在某些情况下,值的大小不同(我知道,因为我有一个数据图)

例如:

[TTTTTDDDDPPPPYYY] - 16 bit field

[YYYYYWWWWWQQQQQQ] - 16 bit field

TTTTT  = 5 bit value, easily extracted
DDDD   = 4 bit value, easily extracted
WWWWW  = 5 bit value, easily extracted
QQQQQQ = 6 bit value, easily extracted
yyyyyy=8位值,跨越字边界。提取这个的最佳方法是什么?在我的例子中,我有很多这样的数据,所以我寻求解决方案的优雅/简单

旁白——在Perl中,左移的限制是什么?我在一台32位计算机上,我猜我的(duck)类型是32位变量,并且我可以移动那么远,即使我将数据解包为16位(使用类型n解包)到一个变量,我猜对了吗?这种情况出现在试图提取位于两个16位字段之间的31位变量的情况下

最后(有人可能会问),将数据读入/解压成32位字对我没有帮助,因为我仍然面临同样的问题——数据不在字边界上对齐,而是跨越它



整数的大小(以字节为单位)由
perl-V:ivsize
或通过编程使用
use-Config-qw(%Config)$配置{ivsize}
。在32位构建中,它们将具有32位(因为它们保证足够大,可以容纳指针)。这意味着你可以使用

my $i = ($hi << 16 | $lo);      # TTTTTDDDDPPPPYYYYYYYYWWWWWQQQQQQ
my $q = ($i >>  0) & (2**6-1);
my $w = ($i >>  6) & (2**5-1);
my $y = ($i >> 11) & (2**8-1);
my $p = ($i >> 19) & (2**4-1);
my $d = ($i >> 23) & (2**4-1);
my $t = ($i >> 27) & (2**5-1);
my$i=($hi>0)和(2**6-1);
我的$w=($i>>6)和(2**5-1);
我的$y=($i>>11)和(2**8-1);
我的$p=($i>>19)和(2**4-1);
我的$d=($i>>23)和(2**4-1);
我的$t=($i>>27)和(2**5-1);
如果要坚持16位,可以使用以下方法:

my $y = ($hi & 0x7) << 5 | ($lo >> 11);

00000[00000000YYY     ]
     [           YYYYY]WWWWWQQQQQQ
     ------------------
     [00000000YYYYYYYY]
my$y=($hi&0x7)>11);
00000[00000000 YYY]
[yyyy]wwwww-qqqq
------------------
[00000000 YYYYYY]

$number=($number>>8)和(2**8-1)
Hello@mpapec-我不认为这回答了问题,尽管我知道我可以把东西转换成数字。我将得到一个8位的值(借助位掩码),但不是完整的数字-尽管这种方法可以扩展到多个字段以形成一个数字。位移位可能是解决这个问题的最明显的方法。我认为这是一个好答案。16位字来自解压为16位值的数据。根据您对问题所做的更改进行了调整。