Преобразовать двоичное строковое представление в байтовый массив

Если вы переименуете столбцы исходного фрейма данных и затем расплавите его в длинный формат с помощью reshape2::melt, его гораздо проще обработать в ggplot2. Определив эстетику color и shape в команде ggplot и вручную определив масштаб для цветов и фигур, появится легенда.

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)

names(arbuthnot) <- c("Year", "Men", "Women")

arbuthnot.melt <- melt(arbuthnot, id.vars = 'Year', variable.name = 'Sex', 
    value.name = 'Rate')

ggplot(arbuthnot.melt, aes(x = Year, y = Rate, shape = Sex, color = Sex))+
geom_point() + scale_color_manual(values = c("Women" = '#ff00ff','Men' = '#3399ff')) + 
scale_shape_manual(values = c('Women' = 17, 'Men' = 16))

enter image description here [/g0]

28
задан ParoX 8 August 2010 в 22:51
поделиться

4 ответа

Если у вас нет этого фетиша LINQ, столь распространенного в последнее время, вы можете попробовать обычный способ

string input ....
int numOfBytes = input.Length / 8;
byte[] bytes = new byte[numOfBytes];
for(int i = 0; i < numOfBytes; ++i)
{
    bytes[i] = Convert.ToByte(input.Substring(8 * i, 8), 2);
}
File.WriteAllBytes(fileName, bytes);

LINQ великолепен но должны быть какие-то ограничения.

35
ответ дан 28 November 2019 в 03:11
поделиться

Вы можете начать с разбиения строки на последовательность из 8-символьных строк, затем преобразовать эти строки в байты и в конечном итоге записать байты в файл

string input = "01110100011001010111001101110100";
var bytesAsStrings =
    input.Select((c, i) => new { Char = c, Index = i })
         .GroupBy(x => x.Index / 8)
         .Select(g => new string(g.Select(x => x.Char).ToArray()));
byte[] bytes = bytesAsStrings.Select(s => Convert.ToByte(s, 2)).ToArray();
File.WriteAllBytes(fileName, bytes);

РЕДАКТИРОВАТЬ: вот еще способ разбить строку на 8-символьные куски, возможно, немного проще:

int nBytes = (int)Math.Ceiling(input.Length / 8m);
var bytesAsStrings =
    Enumerable.Range(0, nBytes)
              .Select(i => input.Substring(8 * i, Math.Min(8, input.Length - 8 * i)));

Если вы знаете, что длина строки кратна 8, вы можете сделать ее еще проще:

int nBytes = input.Length / 8;
var bytesAsStrings =
    Enumerable.Range(0, nBytes)
              .Select(i => input.Substring(8 * i, 8));
10
ответ дан Thomas Levesque 8 August 2010 в 22:51
поделиться

Немного поздно, но вот мои 2 цента:

var binaryStr = "01110100011001010111001101110100";

var byteArray = Enumerable.Range(0, int.MaxValue/8)
                          .Select(i => i*8)
                          .TakeWhile(i => i < binaryStr.Length)
                          .Select(i => binaryStr.Substring(i, 8))
                          .Select(s => Convert.ToByte(s, 2))
                          .ToArray();
File.WriteAllBytes("C:\temp\test.txt", byteArray);
4
ответ дан 28 November 2019 в 03:11
поделиться

Вы уже рассмотрели другие ответы, но ради забавы я написал обратное. Переход от строки к двоичному представлению ascii:

    private static string StringToAsciiBin(string s)
    {
        string output = "";
        foreach (char c in s.ToCharArray())
        {
            for (int i = 128; i >= 1; i /=2)
            {
                if (((int)c & i) > 0)
                {
                    output += "1";
                }
                else
                {
                    output += "0";
                }
            }
        }
        return output;
    }
1
ответ дан 28 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: