Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098

Нужна Помощь в переводе кода C#

17.09.2012, 11:20. Показов 1441. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Есть метод на на c#. Нужно перевести на java. проблема в разнице типов byte между java и c#.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 private byte[] getLine(Bitmap bitmap, int row)
        {
            int w = bitmap.Width;
            int mod8 = (bitmap.Width % 8);
            if (mod8 > 0)
                w = w + (8 - mod8);
            int width = (w / 8);
            byte[] b = new byte[width];
            byte k = 0;
            int x = 1;
            int idx = 0;
            Color c;
            c = bitmap.GetPixel(0, row);
            if (c.R == 0)
                k += (byte)x;
            for (int i = 1; i < bitmap.Width; i++)
            {
                if ((i % 8) == 0)
                {
                    b[idx] = k;
                    k = 0;
                    x = 128;
                    idx++;
                }
                else
                {
                    x /= 2;
                }
                c = bitmap.GetPixel(i, row);
                if (c.R == 0)//It could be R,G or B
                {
                    k += (byte)x;
                }
            }
            return b;
        }
Всем заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2012, 11:20
Ответы с готовыми решениями:

Нужна помощь в переводе довичного кода в десятичный
Нужно написать программу, которая переводит восьмиразрядное двоичное число в десятичное!

Нужна помощь в переводе кода программы из VB.NET в VB 6.0
Здравствуйте.У меня есть код к задаче (решения задачи методом Ньютона ) только для VB.NET,а в 6.0 версию не шарю как первести.Говорят для...

Нужна помощь в написании кода
Есть документ в котором есть поля :Сотрудник(ссылка на справочник сотрудники),проект(ссылка на справочник...

6
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.09.2012, 12:30
замените на short или int и всё заработает
1
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
17.09.2012, 12:37  [ТС]
Спасибо.
Но возвращаемый этим методом массив далее записывается в DataOutputStream его методом write. Не Подскажите пожалуйста как быть с этим.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.09.2012, 12:39
если вы опишете что должно быть на входе и на выходе, тогда получится подсказать, а пока я могу только предполагать и скорее всего ошибусь
1
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
17.09.2012, 12:48  [ТС]
Задача в том, чтобы перевести Bitmap в PCL (printer control language).

В C# код работает нормально, однако после перевода на java все пошло на перекосяк.
Вот код:

метод конвертации bitmap в pcl
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
private bool saveAsPCL(Bitmap bmp)
        {
            try
            {
                int width = bmp.Width;
                int height = bmp.Height;
 
                //Resize width so it has a multiple of 8 bits
                int mod8 = (width % 8);
                if (mod8 > 0)
                    width += 8 - mod8;
                Size size = new Size(width, height);
 
                char ESC = (char)27;
                string SESC = Convert.ToString(ESC);
                String cGraphicsBegin = ESC + "*r0F" + ESC + "*t0200R" + ESC + "*r1A";
                String cGraphicsChunk = ESC + "*b{0}W{1}"; // the number of bytes in the chunk must replace "%d"
                String cGraphicsEnd = ESC + "*rB";
 
                FileStream fs = new FileStream("c:\\1.pcl", FileMode.Create, FileAccess.Write);
                BinaryWriter bw = new BinaryWriter(fs);
 
                int vBytesInGraphicRow = (width / 8);
 
                writeString(bw, cGraphicsBegin);
                int bitmapHeight = bmp.Height;
                for (int i = 0; i < (bitmapHeight - 1); i++)
                {
                    byte[] line = getLine(bmp, i);
                    String s = ESC + "*b" + line.Length + "W";
                    writeString(bw, s);
                    bw.Write(line);
                }
 
                writeString(bw, cGraphicsEnd);
                bw.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
            return true;
        }

Выше описанный метод использует метод getLine для парсинга одной строки. Так же используется метод writeString для записи текста
метод writeString
C#
1
2
3
4
5
private void writeString(BinaryWriter bw, String s)
        {
            foreach (char c in s)
                bw.Write(c);
        }


на java реализовал так

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class BitmapToPCLConverter {
    
    
    private static byte[] getLine(Bitmap bitmap, int row)
    {        
        int w = bitmap.getWidth();
        int mod8 = (bitmap.getWidth() % 8);
        if (mod8 > 0)
        {
            w = w + (8 - mod8);
        }
        int width = (w / 8);
        byte[] b = new byte[width];
        byte k = 0;
        int x = 1;
        int idx = 0;
        int c = bitmap.getPixel(0, row);
        
        if (c!=0)
        {
            k += (byte)x;
        }
        for (int i = 1; i < bitmap.getWidth(); i++)
        {
            if ((i % 8) == 0)
            {
                b[idx] = k;
                k = 0;
                x = 128;
                idx++;
            }
            else
            {
                x /= 2;
            }
            c = bitmap.getPixel(i, row);
            if (c!=0)//It could be R,G or B
            {
                k += (byte)x;
            }
        }
        for(int i=0;i<b.length;i++)
        {
            
        }
        return b;
    }
    
    private static void writeString(DataOutputStream os, String s)
    {
        for(int i=0;i<s.length();i++)
        {
            try 
            {
                os.write(s.charAt(i));
            } 
            catch (IOException e)
            {
                continue;
            }
        }
    }
    public static byte[] GetPCLFromBitmapSaveToFile(Bitmap bmp)
    {
        try
        {
            ByteArrayOutputStream  bs =new ByteArrayOutputStream();
            DataOutputStream os = new DataOutputStream(bs);
                        
          
            
            String cGraphicsBegin = "\033" + "*r0F" + "\033" + "*t0200R" +"\033%-12345X@PJL Enter Language = PCL\033E\033*r1A";
            String cGraphicsEnd = "\033*rB\033%-12345X";
            
            writeString(os, cGraphicsBegin);
            int bitmapHeight = bmp.getHeight();
            for (int i = 0; i < (bitmapHeight - 1); i++)
            {
                byte[] line = getLine(bmp, i);
                String s = "\033*b" + line.length + "W";
                writeString(os, s);                
                os.write(line);
            }
            writeString(os, cGraphicsEnd);          
            os.close();
            
            FileOutputStream fs = new FileOutputStream(Environment.getExternalStorageDirectory()+"/SomeFolder/report1.pcl");
            fs.write(bs.toByteArray());
            fs.close();
            
            return bs.toByteArray();
        }
        catch (Exception ex)
        {
            return null;
        }
    }
Добавлено через 1 минуту
В C# тип byte unsigned, а в java насколько знаю signed. Думаю проблема в этом.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.09.2012, 13:06
я думаю в Вашем случае ещё проблемы с кодировкой строки которую вы выводите как байт массив. В java всё по умолчанию UTF-16 и если вы не сконвертируете строку в нужную вам кодировку, то она попытается по умолчанию сконвертироваться в системную по умолчанию

гетлайн написан исходя из размера 255, и явовский байт его режет до 128, если воспользоваться типом short, то по идее всё должно заработать с небольшим оверхедом

либо bs.toByteArray() переписать так чтобы он смещал значение соответственно C#
1
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
17.09.2012, 13:11  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
я думаю в Вашем случае ещё проблемы с кодировкой строки которую вы выводите как байт массив. В java всё по умолчанию UTF-16 и если вы не сконвертируете строку в нужную вам кодировку, то она попытается по умолчанию сконвертироваться в системную по умолчанию
Могу переконвертировать в UTF-8, но не думаю что проблема в этом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2012, 13:11
Помогаю со студенческими работами здесь

Нужна помощь в валидации HTML-кода
Здравствуйте уважаемые форумчане. Прошедшие 2 дня занимался валидацией кода своего сайта через &quot;validator.w3.org&quot;, причём...

Xor: нужна помощь в разборе кода
Никак не могу толком разобрать код, помогите пожалуйста понять что именно какая строчка что делает.static void Main(string args) ...

Нужна помощь в исправлении кода одной функции...
Плиз.. помогите исправить код функции 'void Opt()', мне необходимо было создать программу которая читатет файл 'd:\file.txt' , создает и...

Нужна помощь с текстом кода в Access (для выборки и обновления таблицы)
Добрый день! Нужна Ваша помощь. Подскажите, пожайлуста, что в моем коде может быть не так: Private Sub bUpd2_Click() On Error...

Массив: Нужна помощь в реализации кода для ввода симметричной матрицы.
Здравствуйте! Есть программа, которая позволяет пользователю вводить матрицу смежности графа, а так же редактировать её. Так же,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru