बाइनरी को ASCII में बदलें और इसके विपरीत


83

एक स्ट्रिंग लेने और इसे बाइनरी में बदलने के लिए इस कोड का उपयोग करना:

bin(reduce(lambda x, y: 256*x+y, (ord(c) for c in 'hello'), 0))

यह आउटपुट:

0b110100001100101011011000110110001101111

जो, अगर मैं इसे इस साइट पर (दाएं हाथ की साइट पर) डालूं तो मुझे अपना संदेश helloवापस मिल जाएगा। मैं सोच रहा हूँ कि यह किस विधि का उपयोग करता है। मुझे पता है कि मैं बाइनरी की स्ट्रिंग को 8 में विभाजित कर सकता हूं और फिर इसे संबंधित मूल्य bin(ord(character))या किसी अन्य तरीके से मेल कर सकता हूं । वास्तव में कुछ सरल की तलाश में।


1
तो क्या आपका प्रश्न है, "स्पष्ट की तुलना में मेरे कोड का व्युत्क्रम करने का एक अधिक सुसंगत तरीका है"?
ट्रिपल

1
संबंधित: b2a_binCython में विस्तार (बाइनरी तार बनाने की अनुमति देता "01") सीधे bytestrings से एक मध्यवर्ती अजगर पूर्णांक बनाए बिना।
5

जवाबों:


160

[ -~]अजगर 2 पर सीमा में ASCII वर्णों के लिए :

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'

उलटे हुए:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'

पायथन 3.2+ में:

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

उलटे हुए:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'

पायथन 3 में सभी यूनिकोड वर्णों का समर्थन करने के लिए:

def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]
    return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
    n = int(bits, 2)
    return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0'

यहाँ एकल-स्रोत पायथन 2/3 संगत संस्करण है:

import binascii

def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int(binascii.hexlify(text.encode(encoding, errors)), 16))[2:]
    return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
    n = int(bits, 2)
    return int2bytes(n).decode(encoding, errors)

def int2bytes(i):
    hex_string = '%x' % i
    n = len(hex_string)
    return binascii.unhexlify(hex_string.zfill(n + (n & 1)))

उदाहरण

>>> text_to_bits('hello')
'0110100001100101011011000110110001101111'
>>> text_from_bits('110100001100101011011000110110001101111') == u'hello'
True

3
@JFSebastian i ने अजगर के वर्तमान संस्करण के साथ इस विधि की कोशिश की और ऐसा लगता है कि यह काम नहीं करता है। <br/> टाइपError: 'str' बफ़र इंटरफ़ेस का समर्थन नहीं करता है <br/> क्या आप अपना जवाब अपडेट करेंगे
हमजा

3
@hamza: यह अजगर 2. पर काम करता है अजगर 3 पर आप पहले जैसे बाइट्स str परिवर्तित करना चाहिए,your_string.encode('ascii', 'strict')
JFS

1
@JFSebasitian: धन्यवाद, हालांकि जब मैंने इसके विपरीत प्रयास किया कि अनहेल्दी फ़ाइनेशन एक त्रुटि संदेश लौटाता है: Binascii.Error: Odd-length string।
हमजा

3
@ झमाझम: '0'अगर हेक्स-स्ट्रिंग की लंबाई भी नहीं है, तो इसके साथ प्रीपेन्ड करें । यह तब होता है जब मूल स्ट्रिंग के पहले वर्ण में एससीआई कोड 16 से कम होता है, '\n'या '\t'। विषम-पत्र कभी भी अस्की अक्षर के लिए नहीं होते हैं [ -~]
jfs

25

निर्मित केवलpython

यहाँ सरल तार के लिए एक शुद्ध अजगर विधि है, यहाँ पोस्टीरिटी के लिए छोड़ दिया गया है।

def string2bits(s=''):
    return [bin(ord(x))[2:].zfill(8) for x in s]

def bits2string(b=None):
    return ''.join([chr(int(x, 2)) for x in b])

s = 'Hello, World!'
b = string2bits(s)
s2 = bits2string(b)

print 'String:'
print s

print '\nList of Bits:'
for x in b:
    print x

print '\nString:'
print s2

String:
Hello, World!

List of Bits:
01001000
01100101
01101100
01101100
01101111
00101100
00100000
01010111
01101111
01110010
01101100
01100100
00100001

String:
Hello, World!

2
chr (int ()) वही है जिसकी मुझे तलाश थी!
JqueryToAddNumbers 8:14

वास्तव में मैं भी क्या देख रहा था !!
जोकिम

10

मुझे यकीन नहीं है कि आप कैसे सोचते हैं कि आप इसे चरित्र-दर-चरित्र के अलावा कर सकते हैं - यह स्वाभाविक रूप से चरित्र-दर-चरित्र ऑपरेशन है। आपके लिए ऐसा करने के लिए निश्चित रूप से कोड है, लेकिन यह चरित्र-दर-चरित्र करने के अलावा कोई "सरल" तरीका नहीं है।

सबसे पहले, आपको 0bउपसर्ग को पट्टी करने की आवश्यकता है , और बाएं-शून्य-पैड को स्ट्रिंग करें ताकि लंबाई 8 से विभाज्य हो, बिटस्ट्रिंग को वर्णों में विभाजित करना आसान बनाने के लिए:

bitstring = bitstring[2:]
bitstring = -len(bitstring) % 8 * '0' + bitstring

फिर आप स्ट्रिंग को आठ बाइनरी अंकों के ब्लॉक में विभाजित करते हैं, उन्हें ASCII वर्णों में परिवर्तित करते हैं, और उन्हें वापस एक स्ट्रिंग में शामिल करते हैं:

string_blocks = (bitstring[i:i+8] for i in range(0, len(bitstring), 8))
string = ''.join(chr(int(char, 2)) for char in string_blocks)

यदि आप वास्तव में इसे एक संख्या के रूप में व्यवहार करना चाहते हैं, तो आपको अभी भी इस तथ्य पर ध्यान देना होगा कि यदि आप दाएं-बाएं के बजाय बाएं-दाएं जाना चाहते हैं तो सबसे बाईं ओर का वर्ण अधिकतम सात अंकों का होगा।


2

यह आपके कार्य को हल करने का मेरा तरीका है:

str = "0b110100001100101011011000110110001101111"
str = "0" + str[2:]
message = ""
while str != "":
    i = chr(int(str[:8], 2))
    message = message + i
    str = str[8:]
print message

आप str = "0" + str [2:] पर '0' क्यों जोड़ रहे हैं? " यहां हटाने के लिए 0 बी की आवश्यकता है क्योंकि यह शुरुआत है।
बिमलेश शर्मा

2

यदि आप ऐसी किसी भी फाइल को आयात नहीं करना चाहते हैं जिसका आप उपयोग कर सकते हैं:

with open("Test1.txt", "r") as File1:
St = (' '.join(format(ord(x), 'b') for x in File1.read()))
StrList = St.split(" ")

पाठ फ़ाइल को बाइनरी में बदलने के लिए।

और आप इसे वापस स्ट्रिंग में बदलने के लिए इसका उपयोग कर सकते हैं:

StrOrgList = StrOrgMsg.split(" ")


for StrValue in StrOrgList:
    if(StrValue != ""):
        StrMsg += chr(int(str(StrValue),2))
print(StrMsg)

आशा है कि उपयोगी है, मैं इसे कुछ कस्टम एन्क्रिप्शन के साथ उपयोग किया है TCP पर भेजें।


1

क्या आप इसे करने के लिए कोड की तलाश कर रहे हैं या एल्गोरिथ्म को समझ रहे हैं?

क्या यह आपको क्या चाहिए ? विशेष रूप से a2b_uuऔर b2a_uu? यदि आप जो चाहते हैं, उस स्थिति में अन्य विकल्पों के बहुत सारे हैं।

(नोट: एक अजगर आदमी नहीं है लेकिन यह एक स्पष्ट जवाब की तरह लग रहा था)


मैं इसे एक बिट के लिए शोध कर रहा हूं, बिनसायसी मेरे लिए काम नहीं कर रहा है, और ज्यादातर कोड की तलाश में है, अगर मैं इसे देख सकता हूं तो मैं इसे समझ सकता हूं। हालांकि धन्यवाद: EDIT: जब बायोसिअस a2b_uu का उपयोग करते हुए बाइनरी में अभिसरण परिवर्तित करना "h" के लिए \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 है जो मुझे नहीं चाहिए, मुझे 'हैलो' और वास्तविक 1 और 0 की आवश्यकता है
शेल्सी

@ जोक्सियान मेरे उद्देश्यों के लिए काफी मददगार था। किसी ने कुछ डेटा एक स्ट्रिंग में संग्रहीत किया है और मेरे पास है। मुझे पूरा यकीन है कि यह पैडिंग का 64binary b / c है। मैं सफलतापूर्वक b2a_base64उस पर उपयोग कर सकता हूं , हालांकि परिणाम वास्तव में, भ्रामक है। मुझे वहाँ से बॉयलर / पूर्णांक (0,1) की सूची कैसे मिलेगी?
उफ़ोस

0

बाइनरी को इसके समकक्ष चरित्र में परिवर्तित करें।

k=7
dec=0
new=[]
item=[x for x in input("Enter 8bit binary number with , seprator").split(",")]
for i in item:
    for j in i:
        if(j=="1"):
            dec=2**k+dec
            k=k-1
        else:
            k=k-1
    new.append(dec)
    dec=0
    k=7
print(new)
for i in new:
    print(chr(i),end="")

-1

यह जेएफ सेबेस्टियन का एक अंकुरित संस्करण है। स्निपेट्स के लिए धन्यवाद हालांकि जेएफ सेबेस्टियन।

import binascii, sys
def goodbye():
    sys.exit("\n"+"*"*43+"\n\nGood Bye! Come use again!\n\n"+"*"*43+"")
while __name__=='__main__':
    print "[A]scii to Binary, [B]inary to Ascii, or [E]xit:"
    var1=raw_input('>>> ')
    if var1=='a':
        string=raw_input('String to convert:\n>>> ')
        convert=bin(int(binascii.hexlify(string), 16))
        i=2
        truebin=[]
        while i!=len(convert):
            truebin.append(convert[i])
            i=i+1
        convert=''.join(truebin)
        print '\n'+'*'*84+'\n\n'+convert+'\n\n'+'*'*84+'\n'
    if var1=='b':
        binary=raw_input('Binary to convert:\n>>> ')
        n = int(binary, 2)
        done=binascii.unhexlify('%x' % n)
        print '\n'+'*'*84+'\n\n'+done+'\n\n'+'*'*84+'\n'
    if var1=='e':
        aus=raw_input('Are you sure? (y/n)\n>>> ')
        if aus=='y':
            goodbye()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.