Gremlin92
@Gremlin92
Целеустремленный

Как передать unsigned char* байты в signed char*массиве?

1.Вкратце читаю uchar[] в char[]
2.Передаю методом send(char[])
FILE* sFile = 0;        // Дескриптор файла
    unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    unsigned char header[6];
    unsigned char tempColors = 0;
    fopen_s(&sFile,"Screen.tga", "wb");
    if (!sFile) {
    }
    header[0] = ScreenWidth % 256;
    header[1] = ScreenWidth / 256;
    header[2] = ScreenHeight % 256;
    header[3] = ScreenHeight / 256;
    header[4] = BMI.bmiHeader.biBitCount;
    header[5] = 0;
    fwrite(tgaHeader, sizeof(tgaHeader), 1, sFile);
    n = send(newsockfd[current], (char*)tgaHeader, sizeof(tgaHeader), 0);
    fwrite(header, sizeof(header), 1, sFile);
    n = send(newsockfd[current], (char*)header, sizeof(header), 0);
    fwrite(ImageBuffer, BMI.bmiHeader.biSizeImage, 1, sFile);
    char* s = new char[100];
    _ultoa_s(BMI.bmiHeader.biSizeImage+17, s,100,10);
    for (int i = 0; i < 100; i++)
        ((type*)args)[current].lalk->buffer[i] = s[i];
    n = send(newsockfd[current], ((type*)args)[current].lalk->buffer, buflen, 0);
    n = send(newsockfd[current], (char*)ImageBuffer, BMI.bmiHeader.biSizeImage, 0);
    fclose(sFile);

На другой стороне
1.Принимаю методом recv(char[]) в переменную char[]
2.Записываю char[] как uchar[]
И не работает(данные искажены). Как это исправить?
FILE* f;
        fopen_s(&f, "Screen.tga", "wb");
        if (!f) {
        }
        unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        unsigned char header[6];
        n = recv(sockfd, (char*)tgaHeader, sizeof(tgaHeader), 0);
        fwrite((unsigned char*)tgaHeader, sizeof(tgaHeader), 1, f);
        n = recv(sockfd, (char*)header, sizeof(header), 0);
        fwrite((unsigned char*)header, sizeof(header), 1, f);
        // Записываем данные изображения:
        bzero(buffer, buflen);
        n = recv(sockfd, buffer, buflen, 0);
        unsigned long j = (unsigned long)atol(buffer);

        std::cout << buffer << std::endl;
        std::cout<<'\n' << "j=" << j << std::endl;
        bzero(buffer, buflen);
        n = recv(sockfd, buffer, j, 0);
        fwrite((unsigned char*)buffer,j, 1, f);
        bzero(buffer, buflen);
        fclose(f);
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
не работает(данные искажены). Как это исправить?

Нужно разбираться, как именно и какие именно данные искажены.
Я подозреваю, что неправильно посылается или принимается.
Что такое "Записываю char[] как uchar[]" -- вообще непонятно, покажи код.
Ответ написан
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
1.Вкратце читаю uchar[] в char[]

Так нельзя делать, неудивительно, что данные искажены.

Хоть и uchar, и char занимают одинаковое количество байт (1 шт в данном случае), но у char 1 бит занят под знак, рассматривая uchar как обычный char, вы получите мусор в случае выхода за границы значений char, т.е. числа больше 127 будут некорректными.

Как это исправить?

Используйте везде только uchar или char.

А вообще при всех ваших махинациях все корректно должно быть, косяк где-то в этих местах: "Вкратце читаю...", "Передаю методом send(char[])", "Принимаю методом", "Записываю char[] как uchar[]"
Ванги в отпусках и без кода нечего сказать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы