【问题标题】:C# Ascii to bytes, parsing not conversionC# Ascii 到字节,解析不转换
【发布时间】:2015-09-30 05:36:31
【问题描述】:

我有一个 Windows 窗体,您可以在其中在一个文本框中输入文本,并在另一个文本框中输出转换。我有各种转换。

说我输入“hello world”

我的 ascii 到字节函数返回:10410110810811132119111114108100

一切都很好。现在我需要使用我的 bytes to ascii 函数将其转换回来。

问题是

byte[] b;  
b = ASCIIEncoding.ASCII.GetBytes(plaintext); //it is a string from the textbox

好的,基本上解决了,但是问题仍然存在,输入“1101000 1100101”作为字符串,解析为字节/字节数组,然后从中获取一个字符串。 (我知道最后一部分)

【问题讨论】:

  • 如果一个问题被标记为重复,则意味着另一个答案将回答您的问题。所以没有必要有数百个问题是相同的。
  • 这是有道理的,但是当我去问一个问题时,它说你有被阻止的危险。我有一个不好的问题,总共只问了 2 个。
  • 一个字节可以表示 0 到 255 之间的数字。您的字符串是这些数字的串联:104、101、108、108、111 表示“hello”。
  • 在你提出问题之前,研究一下 SO 是否已经被问过并且它的答案可以解决你的问题。这将防止您的问题被标记为重复。当您提出问题时,您至少需要提供您的问题是什么、您已经尝试解决问题的努力(代码示例)、可能的输入和预期结果。否则,您将面临被否决和被阻止的风险。阅读本文以帮助您发布“更好”的问题。 stackoverflow.com/help/mcve
  • 我做研究。作为最后的手段,我问了一个问题。我在反思中寻找了大约一个小时的答案。我只是没有正确的术语。

标签: c# parsing binary ascii


【解决方案1】:

更新

从二进制输入字符串到 ASCII 字符串

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string input = "1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100";
        string[] binary = input.Split(' ');

        Console.WriteLine(String.Join("", binary.Select(b => Convert.ToChar(Convert.ToByte(b, 2))).ToArray()));
    }
}

结果:

hello world

Demo

旧答案

所以现在听起来您想将字符串转换为二进制,然后再从二进制转换回字符串。从我的 OLD ANSWER 中,您可以使用 Select() (LINQ) 语句将您的字符串转换为二进制字符串数组。

一旦你有一个二进制字符串数组,要将它转换回来,你必须将每个元素从基数 2 转换为 byte,然后将 byte 转换为 char,从而得到 char[],从中可以转换回string。不需要填充。

using System;
using System.Linq;
using System.Text;

public class Program
{
    public static void Main()
    {
        string input = "hello world";
        byte[] inputBytes = ASCIIEncoding.ASCII.GetBytes(input);

        // Decimal display
        Console.WriteLine(String.Join(" ", inputBytes));

        // Hex display
        Console.WriteLine(String.Join(" ", inputBytes.Select(ib => ib.ToString("X2"))));

        // Binary display
        string[] binary = inputBytes.Select(ib => Convert.ToString(ib, 2)).ToArray();
        Console.WriteLine(String.Join(" ", binary));

        // Converting bytes back to string
        Console.WriteLine(ASCIIEncoding.ASCII.GetString(inputBytes, 0, inputBytes.Length));

        // Binary to ASCII (This is what you're looking for)
        Console.WriteLine(String.Join("", binary.Select(b => Convert.ToChar(Convert.ToByte(b, 2)))));
    }
}

结果:

104 101 108 108 111 32 119 111 114 108 100
68 65 6C 6C 6F 20 77 6F 72 6C 64
1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100
hello world
hello world

Demo

【讨论】:

  • 这是问题所在,现在说我将“1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100”作为字符串,然后将其转换为二进制,而不是解析为二进制,获取 that 字符串 的二进制表示
  • 所以现在听起来您想将字符串转换为二进制,然后再从二进制转换回字符串。 不,我想将字符串解析为二进制输入字符串 = “10101001”返回 ascii 格式。你已经做了一个深思熟虑和很好的答案,但我的问题是,我需要解析它,就像标题所说的那样。不仅仅是转换它。
  • 当你说“解析”时你想要什么?如果您输入的是一个看起来像“1101000 1100101”的二进制字符串。从二进制到十进制的“1101000”是 104,而 104 是字母“h”的十进制值。 “1100101”从二进制到十进制是101,101是字母'e'的十进制值。
  • 因为当我在代码中执行您所拥有的操作时,它会将字符串中的任何二进制文件转换回包含相同二进制文件的字符串
  • @DOSLuke 从链接中,您输入的是二进制字符串,因此您甚至不需要构成二进制数组的前两行。您需要将字符串拆分为一个空格,然后将二进制转换为 ASCII。查看更新的答案。
【解决方案2】:

ASCIIEncoding.ASCII.GetBytes(string) 的倒数是ASCIIEncoding.ASCII.GetString(bytes[])

string plaintext = "hello world";
byte[] b = ASCIIEncoding.ASCII.GetBytes(plaintext);
Console.WriteLine(b); // new bytes[] { 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 }
string s = ASCIIEncoding.ASCII.GetString(b);
Console.WriteLine(s); // "hello world"

ASCIIEncoding.ASCII.GetBytes("hello world") 到底是怎么把10410110810811132119111114108100 还给我的?!这不是二进制的!

它没有给你那个数字。它给你一个字节数组;一个字节数组。 byte 是一个介于 0 和 255 之间的数字(可以存储在一个字节中,因此它们的名称)。你期待什么? 字符串 仅包含 10 字符?那也不是二进制的;这是一个字符串。

您可以使用Convert.ToString 从单个字节中获取二进制字符串:

Console.WriteLine(Convert.ToString(104, 2)); // "1101000"

请注意,您需要对这些字符串进行左填充以使它们使用 8 个字符。

【讨论】:

  • 顺便说一句,我期待返回一个字节数组:{1101000, 1100101}
  • 正如我在回答中试图解释的那样,一个字节是 0 到 255 之间的一个数字,它在内存中占用一个字节。您所期望的是一个包含二进制数字的字符串数组。不过,您必须按照说明进行转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多