gpt4 book ai didi

Perl:如何从字节中提取某些位,然后将这些位转换为十六进制值?

转载 作者:行者123 更新时间:2023-12-04 11:10:00 24 4
gpt4 key购买 nike

我需要提取字节的某些位并将提取位转换回十六进制值。

示例(字节的值为 0xD2):

76543210 bit position
11010010 is 0xD2
  • 位 0-3 定义了 0010b 的 channel 是 0x2
  • 位 4-5 定义了 Controller ,即 01b0x1
  • 位 6-7 定义了 11b 的端口是 0x3

  • 我不知何故需要从字节中获取 0xD2到 channel 是 0x2 , Controller 是 0x1 , 端口是 0x3
    我用谷歌搜索分配并找到了函数 pack / unpack , vec sprintf .但我正在摸索如何使用这些功能来实现这一点。知道如何在 Perl 中实现这一点吗?

    最佳答案

    初始格式是什么?

    my $chr = chr(0b11010010);  # A character  e.g. from read()
    my $bin = '11010010'; # Binary
    my $hex = 'D2'; # Hexadecimal
    my $num = 0b11010010; # A number.
    my $num = 0xD2; # A number.

    您想首先将其转换为数字
    my $num = ord($chr);
    my $num = unpack('C', $chr); # Alternative
    my $num = oct("0b$bin");
    my $num = hex($hex);

    然后你使用类次和面具。
    my $channel    = ($num >> 0) & 0xF;   # Or just: $num & 0xF
    my $controller = ($num >> 4) & 0x3;
    my $port = ($num >> 6) & 0x3; # Or just: $num >> 6

    (您可以使用 0b11110b110b11 作为掩码。大多数人以十六进制工作。)

    或者让 vec为你找导出罩。
    my $channel    = vec $num, 0, 4;
    my $controller = vec $num, 4, 2;
    my $port = vec $num, 6, 2;

    这是 $controller 的示例:
      11010010
    >> 4
    --------
    11010010
    & 11
    --------
    01

    (为了清楚起见,省略了一些零。)

    关于Perl:如何从字节中提取某些位,然后将这些位转换为十六进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13543180/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com