Java 写一个1'的字符串;s和0';是二进制文件吗?
我想获取一个由1和0组成的字符串,并将其转换为一个实际的二进制文件(简单地将1和0组成的字符串写入一个文件将使其成为包含“00110001”和“00110000”的ascii文件)。我更喜欢用python或直接从bash shell中执行此操作,但java或C也可以。这可能是一次性使用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)转换为字符
谢谢。在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类型的异常:
如果您要转换的字符超过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)