【问题标题】:A large hex to binary conversion in bcbc 中的大十六进制到二进制转换
【发布时间】:2012-09-28 03:26:31
【问题描述】:

我正在尝试将 32 个字符长的十六进制字符串(例如:A41EB86E184207262C12F66E7C480577)转换为二进制。我正在使用:

echo "ibase=16; obase=2; $line" | bc

但它包括一个不必要的 \ 中间,它不允许我对结果执行任何位操作。

我得到的一个示例输出是:

10100100000111101011100001101110000110000100001000000111001001100010\
110000010010111101100110111001111100010010000000010101110111

注意第一行末尾的\

我可以做些什么来避免它?

【问题讨论】:

    标签: bash bc


    【解决方案1】:

    如果您有足够现代的bc,您可以将BC_LINE_LENGTH 设置为零以禁用换行:

    pax> echo "ibase=16;
    ...>       obase=2;
    ...>       A41EB86E184207262C12F66E7C480577" | BC_LINE_LENGTH=0 bc
    

    这会在一行中输出您的号码。

    1010010000011110101110000110111000011000010000100000011100100110001011000001...
    

    我倾向于在我的.profile(或.bashrc,我不记得我的头顶)中有它,因为我喜欢它是默认值:

    export BC_LINE_LENGTH=0
    

    来自手册页:

    BC_LINE_LENGTH:这应该是一个整数,用于指定数字输出行中的字符数。这包括长数字的反斜杠和换行符。作为扩展,零值禁用多线功能。此变量的任何其他小于 3 的值都将行长度设置为 70。

    如果您的bc 不支持“0 表示禁用”扩展名,您也可以将其设置得非常高:

    export BC_LINE_LENGTH=9999
    

    如果您的bc 受到“挑战”,因为它根本不允许BC_LINE_LENGTH,您可能需要恢复到输出的后处理,例如使用tr 去除换行符和反斜杠:

    pax> echo "ibase=16;obase=2;A41EB86E184207262C12F66E7C480577" | bc | tr -d '\\\n'
    

    【讨论】:

    • 您是否还知道如何防止自动去除尾随零?
    • @user1355848,我不知道那里 is 去除尾随零。如果你在你的 hex2bin 转换器中输入80,你会得到10000000。所有尾随零都在那里。
    • BC_LINE_LENGTH 在bc 的 POSIX 规范中未提及。但是,POSIX 确实说:在 POSIX 语言环境中,非常大的数字应以每行 70 个字符分隔;其他语言环境可能会在不同的字符边界处拆分。继续的行应以<backslash> 结尾。 以反斜杠换行符(sed 等)结尾的行应该很容易换行。为什么不将行长设置为零以禁用换行?
    • @Jonathan,虽然很奇怪,但行长仍然适用于 POSIXLY_CORRECT 模式下的 gnu-bc。因此,当该行为不可用时,我将添加另一个选项(并将其更改为使用 0 而不是 9999)。
    • 感谢您的回复 :) 对不起。我的意思是一开始的零。不是预告片(因为这可能会改变值)如果第一个字符是 4,它将转换为 100 而不是 0100 任何解决方法?
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 2014-10-30
    • 2020-06-27
    • 2012-05-28
    • 2011-10-11
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多