Nano Hash - криптовалюты, майнинг, программирование

записать двоичную строку как двоичную в файл

Я хочу записать строку, состоящую только из нулей и единиц, в выходной файл, где выходной файл буквально содержит только нули и единицы в порядке, заданном строкой.

На данный момент я пытаюсь записать символ размером 1 бит.

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

int main(int argc, char *argv[])
{   
FILE *out_file;

out_file = fopen("out", "wb");

char s[] = "01010101010101010101"; /*20 chars*/
int i;

for (i = 0; i < 20; i++) {
    fwrite(&s[i], 1, 1, out_file);
}

fclose(out_file);

return EXIT_SUCCESS;
}

Выходной файл в шестнадцатеричном редакторе

30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31

Таким образом, выходной файл содержит значения ascii для нуля и единицы, а не фактические нули и единицы.

Спасибо


  • На самом деле он содержит 0 и 1: 0x30 = 110000, 0x31 = 110001. 09.10.2011
  • но 0x30 - это значение ascii для 0 09.10.2011
  • Я не могу понять вопрос. Вы хотите написать (int)0 или (char)0? 09.10.2011
  • Я просто хотел бы, чтобы выходной файл содержал нули и единицы, а не в ascii, просто в этой последовательности 09.10.2011

Ответы:


1

Используйте escape-последовательности внутри строкового литерала для обозначения байтов 0x00 и 0x01, а не символов 0 и 1:

char s[] = "\x00\x01";
09.10.2011

2

используйте байтовый тип, а не char, и удалите эту строку, конечно, она показывает 0x30 для 0, вы попросили ее написать «0», а не 0 .... вы можете указать двоичный код, используя b byte b1 = 10001110b; конечно, вы не можете сделать из него массив, если вам нужны более длинные числа, вам придется писать их один за другим или написать метод\функцию для разбора двоичных строк для вас, если он не существует в открытом исходном коде уже.

09.10.2011
  • C99 делает. Он называется _Bool. Если вы включите заголовок <stdbool.h>, вы можете использовать его как bool 25.02.2016

  • 3

    Если вы пытаетесь выразить строку «011000100110100101110100» в виде трех байтовых значений 98, 105, 116, вам сначала нужно преобразовать их из массива символов (или «строки», как это называется в C) в массив числовых значений. .

    Что-то вроде этого может быть хорошим началом:

    unsigned char *convert(char *input)
    {
      int len = strlen(input);
      /* Can only correctly handle strings that have 'full' bytes */
      unsigned char *rv = malloc(len/8); 
      char *cp;
      unsigned char *dp = rv;;
      char dp_inc = 0;
    
      for (cp = input; *cp; cp++) {
        *dp = ((*dp) << 1) | (*cp == '1');
        if ((++dp_inc) >= 8) {
          dp_inc = 0;
          dp++;
        } 
      }
    
      return rv;
    }
    

    Эта процедура проходит через входную строку и преобразует ее в двоичные числа, которые она представляет. Вероятно, это может быть связано с некоторой уборкой, поскольку это не обязательно образец читаемого кода и, вероятно, должен возвращать количество выделенных байтов и принимать ограничитель диапазона вместо того, чтобы полагаться на strlen.

    09.10.2011

    4

    Хорошо, вот ваше решение (хотя оно не очень тщательно проверено):

    template<typename TItem, typename TItem2>
    void SetEnableFlags(TItem &BitFlags, const TItem2 &Flags)
    {
        BitFlags = (BitFlags|Flags);
    }
    
    const unsigned char CharArrayToByte(const char Data[])
    {
        if(Data == NULL){return 0;}
        if(strlen(Data) < 8){return 0;}
        unsigned char Byte = 0;
        SetEnableFlags(Byte,(Data[0]-'0')*128);
        SetEnableFlags(Byte,(Data[1]-'0')*64);
        SetEnableFlags(Byte,(Data[2]-'0')*32);
        SetEnableFlags(Byte,(Data[3]-'0')*16);
        SetEnableFlags(Byte,(Data[4]-'0')*8);
        SetEnableFlags(Byte,(Data[5]-'0')*4);
        SetEnableFlags(Byte,(Data[6]-'0')*2);
        SetEnableFlags(Byte,(Data[7]-'0')*1);
        return Byte;
    }
    
    const bool ConvertToBytes(char Bytes[], const char Binary[])
    {
        if( (Binary == NULL) || (Bytes == NULL) ){return false;}
    
        //Checks it's a power of 8
        int Size = strlen(Binary);
        if(Size < 8){return false;}
        float SizeTest = ((float)Size/8.0);
        if( (SizeTest - (int)SizeTest ) != 0.0 ){return false;}
    
        unsigned int Power = 0;
        unsigned int Iter = 0;
        do
        {
            Power = 8*Iter;
            Bytes[Iter] = CharArrayToByte( (Binary+Power)  );
            Iter++;
        }while(Power < Size);
        return true;
    }
    
    int main()
    {
        char Bytes[3]; //Allocate enough space for it
        char Binary[] = "000000010000001100001111"; //1, 3, 15
        if(!ConvertToBytes(Bytes,Binary)){return 1;}
    
        printf("%d %d %d!\n",Bytes[0],Bytes[1],Bytes[2]);
    
        return 0;
    }
    

    Вы также можете прочитать эту тему здесь чтобы облегчить вашу работу.

    Код не оптимизирован. Вы можете использовать его для любых целей, даже коммерческих (если вы можете его продать). Строки станут нечитаемыми за пределами 8 бит, поэтому вы можете просто вызвать CharArrayToByte вручную (убедитесь, что длина массива символов действительно составляет 8 символов, иначе у вас возникнут проблемы). Если вы хотите преобразовать его обратно, это вопрос обратного процесса.

    Неясно, используете ли вы C или C++ (с кодированием C), поэтому вам, вероятно, придется изменить его в соответствии с вашими потребностями.

    09.10.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..