如何将字符串编码成二进制?

本文介绍两种编程方法,将文字信息转化为0和1的ASCII码表示形式,适用于想在七夕用独特方式表达爱意的人们。一种是使用C语言通过位移操作实现,另一种则是用Python采用标准转换方法。

七夕将至,想用0和1来表达爱意吗?下面两个程序正好帮忙,可以将一个字符串转换为0和1表示的ascii码,不过目前对英文有效,中文没试。

一种是用C语言写的,通过移位来实现。


#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    char *p = argv[1];
    char c;
    int len = strlen(p);

    while(len--)
    {   
        c = *p++;
        int i;
        for (i = 0; i < 8; ++i)
        {   
            if (c & 0x80)
                printf("1");
            else
                printf("0");
            c <<= 1;
        }   
        printf(" ");
    }   
    printf("\n");
    return 0;
}

另一种是用python写的,是比较正统的转换方法,即“辗转相除法”

#!/usr/bin/env python

import sys 

def bin(x):
    result = ''
    x = int(ord((x)))
    while x > 0:
        mod = x % 2 
        x /= 2
        result = str(mod) + result
    while len(result) < 8:
        result = '0' + result
    return result

def string2bin(s):
    bins = []
    for c in s:
        bins.append(bin(c))
    return bins


if __name__ == '__main__':
    bins = string2bin(sys.argv[1])
    for bin in bins:
        print bin,



<think>在.NET Framework 2.0中,将字符串转换为二进制数据(字节数组)可以使用`System.Text.Encoding`类。字符串在计算机中是以二进制形式存储的,转换过程就是根据指定的字符编码字符串编码为字节序列。 以下是具体步骤: 1. 选择适当的字符编码(如UTF-8、Unicode、ASCII等)。 2. 使用该编码的`GetBytes`方法将字符串转换为字节数组。 示例代码: ```csharp using System; using System.Text; class Program { static void Main() { string input = "Hello, 世界!"; // 使用UTF-8编码字符串转换为字节数组 byte[] binaryData = Encoding.UTF8.GetBytes(input); // 输出字节数组(二进制数据) Console.WriteLine("二进制数据(十六进制表示):"); foreach (byte b in binaryData) { Console.Write($"{b:X2} "); // 以十六进制格式输出每个字节 } } } ``` 输出: ``` 二进制数据(十六进制表示): 48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C 21 ``` ### 解释: - `Encoding.UTF8.GetBytes(string)`:使用UTF-8编码字符串转换为字节数组。 - 如果字符串包含非ASCII字符(如中文),使用UTF-8编码可以确保正确转换。 - 也可以使用其他编码,例如: - `Encoding.Unicode`:UTF-16编码(每个字符2或4字节) - `Encoding.ASCII`:仅支持ASCII字符(0-127),非ASCII字符会被替换为'?'。 ### 将二进制数据转换回字符串: ```csharp // 将字节数组转换回字符串 string output = Encoding.UTF8.GetString(binaryData); Console.WriteLine("\n转换回的字符串: " + output); ``` ### 注意事项: 1. **编码选择**:不同的编码会产生不同的二进制表示。UTF-8是推荐的标准,因为它兼容ASCII且能表示所有Unicode字符,同时对于主要使用拉丁字母的文本更节省空间。 2. **字节顺序标记(BOM)**:默认情况下,.NET的UTF-8编码器不会在字节数组开头添加BOM(0xEF,0xBB,0xBF)。如果需要BOM,可以使用`Encoding.UTF8.GetPreamble()`获取,然后手动添加。 3. **性能**:对于大字符串,此方法会分配与字符串长度比例的字节数组。如果处理超大字符串,需考虑内存使用。 ### 扩展:二进制字符串表示 如果需要将字节数组表示为二进制字符串(即由"0"和"1"组字符串),可以按位处理每个字节: ```csharp // 将字节数组转换为二进制字符串(每个字节表示为8位二进制string binaryString = string.Join(" ", Array.ConvertAll(binaryData, b => Convert.ToString(b, 2).PadLeft(8, '0'))); Console.WriteLine("二进制字符串: " + binaryString); ``` 输出示例(部分): ``` 二进制字符串: 01001000 01100101 01101100 01101100 01101111 00101100 00100000 ... ``` ### 引用说明 在.NET Framework 2.0中,字符编码处理是基础功能,无需额外引用[^2]。 §§相关问题§§ 1. 如何将二进制数据(字节数组)转换为十六进制字符串? 2. 在C#中如何比较不同编码方式对字符串转换的影响? 3. 如何处理大文件的字符串二进制转换以避免内存问题?</think>### 在 .NET Framework 2.0 中将字符串转换为二进制数据 在 .NET Framework 2.0 中,可以使用 `System.Text.Encoding` 类将字符串转换为二进制数据(字节数组)。以下是完整的实现方法: #### 1. 字符串二进制(字节数组) ```csharp using System; using System.Text; class StringToBinaryConverter { public static byte[] StringToBinary(string input) { // 使用UTF-8编码字符串转换为字节数组 return Encoding.UTF8.GetBytes(input); } public static string BinaryToString(byte[] binaryData) { // 将字节数组转换回字符串 return Encoding.UTF8.GetString(binaryData); } } ``` #### 2. 使用示例 ```csharp class Program { static void Main() { string original = "Hello, 世界!"; // 字符串二进制 byte[] binaryData = StringToBinaryConverter.StringToBinary(original); // 输出二进制数据(十六进制表示) Console.WriteLine("二进制数据(十六进制):"); foreach (byte b in binaryData) { Console.Write($"{b:X2} "); // 以十六进制格式输出每个字节 } // 二进制转回字符串 string restored = StringToBinaryConverter.BinaryToString(binaryData); Console.WriteLine($"\n\n还原的字符串: {restored}"); } } ``` #### 输出结果: ``` 二进制数据(十六进制): 48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C 21 还原的字符串: Hello, 世界! ``` ### 关键点说明 1. **编码选择**: - 使用 `Encoding.UTF8` 处理 Unicode 字符(如中文) - 对于纯 ASCII 文本,可用 `Encoding.ASCII` - 其他可用编码:`Encoding.Unicode`(UTF-16)、`Encoding.Default`(系统默认编码) 2. **二进制表示**: - 实际存储的是字节数组(`byte[]`) - 示例中展示了十六进制表示,实际存储形式取决于应用场景 3. **特殊字符处理**: ```csharp // 包含控制字符的字符串 string special = "Line1\nLine2\tTab"; byte[] data = Encoding.UTF8.GetBytes(special); ``` ### 扩展:生二进制字符串表示 如果需要生由 "0" 和 "1" 组二进制字符串(如 "01010101"),可添加以下方法: ```csharp public static string ToBinaryString(byte[] data) { StringBuilder sb = new StringBuilder(); foreach (byte b in data) { // 将每个字节转换为8位二进制表示 sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')); sb.Append(' '); // 添加空格分隔字节 } return sb.ToString().Trim(); } // 使用示例 string binaryStr = ToBinaryString(binaryData); Console.WriteLine($"二进制字符串: {binaryStr}"); ``` ### 注意事项 1. **编码一致性**:转换和还原必须使用相同编码 2. **二进制数据存储**:可直接保存到文件或数据库 ```csharp // 保存到文件 File.WriteAllBytes("data.bin", binaryData); // 从文件读取 byte[] fileData = File.ReadAllBytes("data.bin"); ``` 3. **性能考虑**:大文本处理时建议使用流式操作 在 .NET Framework 2.0 中,字符编码处理是基础功能,无需额外引用库[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值