2017-01-17 20 views
0

Я новый в этом сообществе. Мы программируем mips в университете, и мне нужно решение для моей проблемы в моей домашней работе. Нам нужно открыть файл .pgm и прочитать так называемый заголовок (в этом случае формат p5 и переменная длина x широкий). Когда вы открываете файл, который вы прочитали, вы получаете 4 строки с 1-м. p5; Второй. длина х широкая; в-третьих, глубина цвета и четвертый длинный код ascii. Моя работа - это теперь преобразовать этот ascii, и я думаю, что должен знать размер этого ascii. Раньше у меня был код MIPS для преобразования ASCII, но проблема здесь в том, что этот код преобразует только часть моего члена ASCii, как это (комментарии в германо жаль, что):Mips Assembler- Как получить длину .ascii

.data 
str: .ascii "GV_]VTI=97:@JPH<1-/6;L\pz ­¶³¶»ÃËËÄ»°y{xzk`[email protected]@?>9326<DD:1.--++*-./-//000002222344///35;@LVau ¥´¬§»Çĸ³³»ª °¿Åù±¯¦||x{{yttw{sv}¡°¸±¡¡£¢£p_Z[_hfYUW^accacdehhhhdghjjlnnonnnljifjgfdggfdiiiillllglrvtkiltzx~«ÀÖ¿°©´¾ÃÇÈ×ßãÖÇ»º­¡±¼ËÙENSOIHD>;>CHTPB4/+.6<JWizª¯®°¸ÃËËÄ»¶xvj\NECDB<735:?:40//---,+,--./00000222235400259=DNXdw£­®³½Á½³¯¯²¢¥§°»ÃÆÃµ©«}z{|xtmmqus¡±À¹¦m`ZZ^ce\WZ^abcacdehhhhdghjjlnnonnnlljijhggihhfiiiillmljnuxvnlqw~|¤¶ÐáÕÉÅÇÈÇÉÌÝàÒľ³µª¡¡¤±¼ËÙ[email protected]??DILNRI=1,*-6=ISao §¨­·ÃËËÄ»º¯wpg\SIEDC>83359520110//.--,-//0000022224751139=CGOXfx£®¼¶®¨¤£¥°»À»¾¼³©¥vnjjmsz¬ÅÅÆ³xxttxuja[Y[_c`^]^abcacdfhhhhdghjjlnnnnnnonkjlkihjjhghhhhkkjknsy}vpqw~¸ÏãéáÝ×ÓÌÁÂÈÙà¶²ª¬¥¦¢§ ¡¨±¼ÌÙ@[email protected]<82.+)-6>IO[e| £«´ÅËËļÁ¹­vndbVKACA<11/.-.//000022225772/4<AFIQYhx¢°½­{¡±½½±²¶´®|lmos¸ÍÌ®tpmjgnnjc[XX[`a`_^abcacdfhjhhdghjjlnoonnnpomknmkjljihggggjjjjsv{wrs}¸ÑãíêÝß×ÏǸ´½ÐÛµ²§¡¨¡ª ¢«²¤¡«±ºÌÙ:ADEA>:5;94268501051" 
# it converts just to: GV_]VTI=97:@JPH<1 
     .text 
main: 


addi $s0, $zero, 0 # $s0 :=0; hier wird das Ergebnis aufsummiert 
la $s1,str   # $s1 := &str; hier wird der Zeiger auf das nächste Zeichen gehalten 
addi $s2, $zero, 10 # $s2 := 10; hier steht konstand die 10 zur Multiplikaton 
addi $s3, $zero, 48 # s3 := 48; hier 48, um die ASCII "0" in den Wert 0 umzuwandeln 

loop: 
lb $s4,($s1)  # Lade nächstes Zeichen des 
sub $s4, $s4, $s3 #Bilde ASCII-Ziffer auf Integer-Wert [0..9] ab 
bltz $s4,terminate # Wenn Zeichen <0, 
mult $s0, $s2 
mflo $s0   # §s0 := §s0 *10 
add $s0, $s0, $s4 # s0= s0 + Ziffernwert 
addi $s1, $s1, 1 # s1= s1+1; also auf die nächstes Zeichn im String 
j loop 

terminate: 
li $v0,1   # Resultat ausgeben 
or $a0, $zero, $s0 # in ss0 stand das Ergebnis 
syscall 
li $v0,10 
syscall 

Надеюсь, ты можешь дать мне подсказку.

+1

Непонятно, что вы хотите преобразовать. Это явно не число? – Jester

ответ

0

Сначала я не понял ваш вопрос, но я до сих пор думаю, что мой вид ответа также является частью реального ответа, поэтому первый:

Один вопрос должен быть «как найти конец заголовка и начало данных изображения ".

Последний символ PGM header является «первым символом пробега после максимального значения серого». Таким образом, вам нужно разобрать целое значение заголовка по значению, пока вы не разобраете серого-макс, тогда следующий байт должен быть пробельным (32 (пробел), 9 (TAB), 13 (CR), 10 (LF), 11 (VT), 12 (FF)), затем начнутся данные пикселя.

IMHO это довольно глупый формат, так как я уверен, что кто-то из DOS создал некоторое изображение с «13, 10» CR + LF после серого макс, но ... не ваша проблема (или проверьте файл после загрузки в память, что он прочитал).

А теперь вернусь к вашему реальному вопросу ...

Первого, эти данные не ASCII. Это двоичные пиксельные данные. Ваш «GV» уже два пикселя значений 71 и 86. Когда вы показываете его как строку ASCII, тогда, конечно, 71 отображается как «G», но это не имеет никакого отношения. Все «ASCII» о PGM - это только заголовок, после обнаружения конца заголовка, в который вставляются двоичные данные.

И размер этих двоичных данных: width*height*bytes_per_pixel. Bytes_per_pixel - 1 для gray_max < 256 и 2 для gray_max находящийся в диапазоне 256..65535.

Когда используется 2 байта на пиксел, самый старший байт является первым (поэтому значение 4097 кодируется как байты: 16, 1, а значение 71 кодируется как: 0, 71).

Если у вас есть 0-255 изображений в оттенках серого с «max grey» в заголовке, установленном на 255, тогда вы просто читаете оставшиеся (width*height) байты файла в виде двоичных данных (после последнего символа заголовка), и все, те, ваши пиксельные данные, ряд за строкой, сверху вниз.

Если max_gray - это что-то еще, например, 40 или 15000, то сомнительно, нужно ли каким-то образом преобразовать данные пикселя в 0-255 8-битный диапазон (в первом случае «масштабирование» их во втором «масштабировании», вероятно, с помощью некоторого гамма-преобразования, если это будет хотеть быть профессиональным читателем PGM). Но я ожидаю, что ваша школьная задача будет всего лишь 0-255 изображений без реализации гамма-коррекции.

 Смежные вопросы

  • Нет связанных вопросов^_^