Java 写一个1'的字符串;s和0';是二进制文件吗?

Java 写一个1'的字符串;s和0';是二进制文件吗?,java,python,c,bash,Java,Python,C,Bash,我想获取一个由1和0组成的字符串,并将其转换为一个实际的二进制文件(简单地将1和0组成的字符串写入一个文件将使其成为包含“00110001”和“00110000”的ascii文件)。我更喜欢用python或直接从bash shell中执行此操作,但java或C也可以。这可能是一次性使用 谢谢。在Python中,使用int内置函数将0和1的字符串转换为数字: >>> int("00100101", 2) 37 然后使用内置的chr将8位整数(即,包含范围0-255)转换为字符

我想获取一个由1和0组成的字符串,并将其转换为一个实际的二进制文件(简单地将1和0组成的字符串写入一个文件将使其成为包含“00110001”和“00110000”的ascii文件)。我更喜欢用python或直接从bash shell中执行此操作,但java或C也可以。这可能是一次性使用


谢谢。

在Python中,使用
int
内置函数将0和1的字符串转换为数字:

>>> int("00100101", 2)
37
然后使用内置的
chr
将8位整数(即,包含范围0-255)转换为字符

>>> chr(_)
'%'

chr
的结果可以用
file.write
方法简单地写入文件(以二进制模式打开)。

这并不实用,但有一种方法可以在shell脚本中完成。注意:它使用
bc

#!/bin/bash

# Name of your output file
OFILE="output.txt"

# A goofy wrapper to convert a sequence of 8 1s and 0s into a 8-bit number, expressed in hex
function bstr_to_byte()
{
    echo "obase=16;ibase=2;$1" | bc
}


# Build input string from stdin
#   This can be done using pipes ( echo "1010101..." | ./binstr.sh
#   Or "interactively", so long as you enter q on it's own line when you are done entering your
#       binary string.
ISTR=""
while read data; do
    if [[ ${data} != "q" ]] ; then
        ISTR="${ISTR}${data}"
    else
        break
    fi
done

# Byte-by-byte conversion
while [[ $(expr length ${ISTR}) -ge 8 ]] ; do
    # Copy the first 8 characters
    BSTR=${ISTR:0:8}
    # Drop them from the input string
    ISTR=${ISTR:8}
    # Convert the byte-string into a byte
    BYTE=$(bstr_to_byte $BSTR)

    # Debug print
    ##echo "$BSTR => [ ${BYTE} ]"

    # Write character to file
    echo -en "\x${BYTE}" >> ${OFILE}

    # Check for empty ISTR, which will cause error on iteration
    if [[ -z ${ISTR} ]] ; then
        ##echo "String parsed evenly"
        break
    fi
done

##echo "Remaining, unparsed characters: ${ISTR}"
如果您命名为
binstr.sh
,则可以通过管道标准运行,例如:

echo "11001100" | ./binstr.sh
您可以使用hexdump之类的工具进行检查,例如,
hexdump output.txt

我应该指出,这是假设您的字符串是首先使用MSB输入的。它还将简单地丢弃任何数量的不构成完整字节的“位”。你可以改变这一点,或者只是确保你的输入足够多


最后,这里有一些我留下的调试行,但用双#号注释掉了。

在java中有内置的函数Integer.parseInt(字符串strBinaryNumber,int-radix)方法

它的作用是

             String strBinaryNumber="00100101";
     System.out.println(Integer.parseInt(strBinaryNumber,2));
输出将是: 37

但是 如果发生以下任何情况,将引发NumberFormatException类型的异常:

  • 第一个参数为null或长度为零的字符串
  • 基数小于Character.MIN_基数或大于Character.MAX_基数
  • 字符串的任何字符都不是指定基数的数字,除非第一个字符可以是减号“-”('\u002D'),前提是字符串长度大于1。 4.字符串表示的值不是int类型的值

  • 如果您要转换的字符超过8个(我想您是这样做的),那么您需要这样的东西(使用Python):

    这会将位字符串拆分为8个字符的块(如果字符串长度不是8的倍数,则应先填充),将每个块转换为整数,然后将整数列表转换为可直接写入二进制文件的
    bytearray
    (无需将其转换为字符串):

    如果您有更多类似的任务,那么有一些库可以提供帮助,例如,下面是使用“我的模块”进行的相同转换:


    任何可以进行移位的语言都可以组合任意基数的数字。虽然我是不同语言可以轻松访问这类内容的不同方式/操作的粉丝,但永远不要忘记,所有这些背后都有一些非常基础的数学

    在这种情况下,二进制只是2的简单幂,因此:

        1 << 1 = 1
        1 << 2 = 2
        1 << 3 = 4
        1 << 4 = 8
    
    不是问题的一部分,而是相关的。。。并进一步:

    十六进制是0到F(16个值)的值,每个值可以放入4位。。。所以

        1010 0101 (8+2) (4+1) - Binary using powers of 2 only on 4 bits (8 4 2 1)
        10   5    (Decimal) - (10 << 4) + 5 = 165
        A    5    (Hexadecimal)
    
    1010 0101(8+2)(4+1)-仅在4位(8 4 2 1)上使用2的幂的二进制
    
    10 5(十进制)-(10给下选者-请解释一下我做错了什么也许他/她不懂下划线。@泰勒:那么他/她应该问一下?此外,我希望+2能学到一些新的有用的东西;-)当然,如果字符串长度超过8个字符,这就行不通了,所以这实际上只是解决方案的一半。@Eli:我同意你的答案提供了很好的指导,我只是指出这不是一个完整的答案。完整答案实际上仍然只是一行,因此我认为给出它并没有什么不合理的帮助(如果OP询问如何转换8个字符位的字符串,您会给出一个不太完整的答案,以便不给出完整的解决方案吗?)这类事情即使在C语言中也是不可能做到的。@trinithis鉴于下面所有的例子,你认为如何?我还没有尝试过这一点,但我想知道为什么它被否决了,因为这似乎正是我想要做的。否决票现在似乎已经消失了,谁知道呢。我已经添加了一个关于您的位字符串需要是8的倍数的注释,否则它将得到错误的最后一个字节,但否则这应该适合您。
    >>> from bitstring import BitArray
    >>> with open('somefile', 'wb') as f:
    ...     BitArray(bin=b).tofile(f)
    
        1 << 1 = 1
        1 << 2 = 2
        1 << 3 = 4
        1 << 4 = 8
    
        (1 << 7) + (0 << 6) + (1 << 5) + (0 << 4) + (0 << 3) + (1 << 2) + (0 << 1) + 1
    
        1   0  1  0  0 1 0 1
        128 64 32 16 8 4 2 1 = 128 + 32 + 4 + 1 = 165
    
        1010 0101 (8+2) (4+1) - Binary using powers of 2 only on 4 bits (8 4 2 1)
        10   5    (Decimal) - (10 << 4) + 5 = 165
        A    5    (Hexadecimal)