Кто сделает string как byte

Тема в разделе "Закажу проект", создана пользователем Grekhack, 21 ноя 2019.

  1. Grekhack

    Grekhack Нуб

    Есть string значения '99999999' как записать это как байт в переменную byte=0x99 пример:
    String a='999999';
    String b='0x';
    String c='0x';
    String d='0x';
    String e='0x';
    b+=a[0]+a[1];
    c+=a[2]+a[3];
    d+=a[4]+a[5];
    e+=a[6]+a[7];
    Byte ab=b;
    Byte bb=c;
    Byte cb=d;
    Byte db=e;
     
  2. Asper Daffy

    Asper Daffy Иксперд

    '99999999' в байт? Никак!
     
    SergeiL и Tomasina нравится это.
  3. Grekhack

    Grekhack Нуб

    В пример посмотрели
     
  4. SergeiL

    SergeiL Оракул Модератор

    По примеру абсолютно непонятно, что Вам нужно.
    Напишите, что Вам нужно.
     
  5. akl

    akl Гуру

  6. Asper Daffy

    Asper Daffy Иксперд

    А чего в него смотреть, там из строки, состоящей из 6 байтов, вытаскивают все восемь. Я же говорю - никак :)
     
  7. SergeiL

    SergeiL Оракул Модератор

    Да и дальше...
     
  8. Grekhack

    Grekhack Нуб

    Есть массив arr значения в байтах пример
    Byte arr{1,2,3,4};
    Нужно записат вот так данные
    String a='12345678';
    String b='0x';
    String c='0x';
    String d='0x';
    String e='0x';
    b+=a[0]+a[1];
    c+=a[2]+a[3];
    d+=a[4]+a[5];
    e+=a[6]+a[7];
    Byte arr[1]=b;
    Byte arr[2]=c;
    Byte arr[3]=d;
    Byte arr[4]=e;
    Вот так должен выглядеть
    Arr[3]
    Значение
    0х56
     
  9. KindMan

    KindMan Гуру

    Это контрольная, что ли?
    Ну так @akl предложил вариант.
     
  10. akl

    akl Гуру

    так и не стало понятнее что надо ТСу. И язык какой-то непонятый - джаваскрип чтоль? я только си котирую.
    я вот так сделал посредством strtol()
    Код (C++):

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

    char isdigit(char c){//функция определяет является ли знак 16-ричной цифрой
        if((c>='0'&&c<='9')||(c>='a'&&c<='f')||(c>='A'&&c<='F')){
            return 1;
        }else {return 0;}
    }
    char a[]="012zzz345678abCDeF000011";//исходный нультерменированный массив
    int len;//переменная для хренения длинн массивов
    char nom[2];//массив под две цифры

    int main()
    {
        len=strlen(a);//определяем длину исходного массива
        printf("%s l=%d\n",a,len);//печатаем исходный массив и его длину

        int i,j;
        for(i=0,j=0;i<=len;i++,j++){//убираем из массива все нецифры
            while(!isdigit(a[i])&&i<len){
                i++;
            }
            a[j]=a[i];
        }
        len=strlen(a);//определяем длину почищенного массива
        printf("%s l=%d\n",a,len);//печатаем массив и длину после чистки

        //создаем выходной массив в 2 раза меньше исходного
        char Arr[len/2+1];
        for(i=0,j=0;i<len;i+=2,j++){
            nom[0]=a[i];//во вспомогательный массив вносим
            nom[1]=a[i+1];//цифры попарно
            char *endp;//надо создать этот указатель чтоб работало strtol()
            //посредством strtol() набиваем в выходной массив значения в 16-ричном формате:
            Arr[j]=(char)strtol(nom,&endp,16);
        }
        Arr[j]=0;//ставим в конец выходного массива ноль

        //определяем длину выходного массива
        len=j; //не strlen() чтобы не оборвалось если в середине есть нули
        printf("lout=%d\n",len);
        //печатаем выходной массив поячеечно в формате беззнакового хекса
        for(i=0;i<len;i++){
            printf("%02X\n",(unsigned char)Arr[i]);
        }

        return 0;
    }
    [​IMG]
    не факт что это лучшее решение, но вроде работает. Добавил удаление лишних символов (не циферных).
    Если длина строки нечетная, то последняя цифра становится 0x0N
    возможны баги
     
  11. DetSimen

    DetSimen Guest

    akl, открой для себя стандартную функцию
    isHexadecimalDigit(), или лучше isxdigit();

    вместо

    Код (C++):
    char isdigit(char c){//функция определяет является ли знак 16-ричной цифрой
        if((c>='0'&&c<='9')||(c>='a'&&c<='f')||(c>='A'&&c<='F')){
            return 1;
        }else {return 0;}
    }
    которую тоже, кста, можно сократить до

    Код (C++):
    bool isdigit(char c){//функция определяет является ли знак 16-ричной цифрой
        return ((c>='0'&&c<='9')||(c>='a'&&c<='f')||(c>='A'&&c<='F'));
    }
     
    akl нравится это.
  12. b707

    b707 Гуру

    Судя по коду в первом сообщении, ТС-у на выходе нужно получить вовсе не строчки

    Перевожу его задачку на русский

    Взять строчку "12345678", интерпретировать как число в HEX - то есть 0x12345678 - и далее преобразовать в long и вывести отдельными байтами
    arr[1] = 0x12
    arr[2] = 0x34
    ... и так далее
     
    Последнее редактирование: 22 ноя 2019
  13. akl

    akl Гуру

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

    SergeiL Оракул Модератор

    Если смотреть этот код:
    1) массив nom - размер массива 2. Нужно 3, в третий - 0 (конец строки)
    Иначе еcли в памяти в следующем элементе случайно будет символ '0'-"9' или 'A'-F' он тоже будет конвертироваться как исходная строка.

    2) Arr[j]=0 - не нужен, там не строка.

    Наверное имелось в виду про 0 к nom?

    Если нам не нужен указатель на непреобразованные символы - можно 0 передать и не создавать указатель. Внутри функции есть проверка на 0, если не ноль - то только тогда в него будет записан адрес первого, не цифрового, символа.
     
    Последнее редактирование: 22 ноя 2019
    akl нравится это.
  15. akl

    akl Гуру

    не, просто тупанул :D

    тогда наверно лучше объявлять как-то так
    char nom[]="00";