【问题标题】:convert ASCII code to number将 ASCII 码转换为数字
【发布时间】:2013-11-04 12:07:14
【问题描述】:

我有一个文件,其中包含 12 列(bam 文件),第 11 列包含 ASCII 码。在一个文件中,我有多个 ASCII 码。我想将其转换为数字。 我认为是这段代码:

perl -e '$a=ord("ALL_ASCII_CODES_FROM-FILE"); print "$a\t"'

我想创建循环来读取第十一列中的所有 ASCII 代码,将其转换为数字并将结果计数为一个数字。

【问题讨论】:

  • 显示示例输入和输出。 “将 [多个 ASCII 代码] 转换为数字”可以是许多不同的事情。
  • 输入是一列,带有 ASCII 码。输出是同一列数字,使用 ORD 函数进行转换(将 ASCII 转换为数字)。在此之后,我计算这些数字并将其除以行数...
  • 描述输入与显示输入完全不同。

标签: perl numbers integer ascii data-conversion


【解决方案1】:

您需要将字符串拆分为单个字符,遍历每个字符,并在循环中调用ord

my @codes = map ord, split //, $str;
say join '.', map { sprintf("%02X", $_) } @codes;

unpack 'C*' 可以方便地完成所有这些操作。

my @codes = unpack 'C*', $str;
say join '.', map { sprintf("%02X", $_) } @codes;

如果您确实打算以十六进制打印出来,您可以在printf 中使用v 修饰符。

say sprintf("%v02X", $str);

【讨论】:

  • +1 表示v 修饰符。为什么不say unpack "H*", $str; 呢? (此外,我们似乎对这个问题的解释有点不同——我们会看看我们中的哪一个猜得更接近 OP 的实际意图。)
  • @Ilmari Karonen,这并不适用于所有字符,尽管它适用于所有 ASCII。它也不分隔字符。
【解决方案2】:

将字符串转换为相应 ASCII 代码列表的自然工具是unpack

my @codes = unpack "C*", $string;

特别是,假设您正在解析 SAM file(或更一般地说,任何 FASTQ-style quality string)的 QUAL 列,我相信正确的转换应该是:

my @qual = map {$_ - 33} unpack "C*", $string;

附言。从您提到的“列”中,我假设您实际上是在解析 SAM 文件,而不是 BAM 文件。如果我正确阅读规范,BAM 格式似乎没有使用 +33 偏移量作为质量值,所以如果您正在解析 BAM 文件,您只需使用上面的第一个示例为此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2016-06-21
    • 2011-10-03
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多