2017-01-17 6 views
0

Ich bin neu in dieser Community. Wir programmieren Mips in der Universität, und ich brauche eine Lösung für mein Problem in meinen Hausaufgaben. Wir müssen eine .pgm-Datei öffnen und den so genannten Header lesen (in diesem Fall mit p5-Format und variabler Länge x breit). Wenn Sie die Datei öffnen, die Sie gelesen haben, erhalten Sie 4 Zeilen mit 1st. p5; 2. Länge x Breite; drittens die Farbtiefe und die vierte lange Laufzeit des ASCII-Codes. Mein Job ist es jetzt, diese Ascii zu konvertieren und ich denke, ich muss die Größe dieses Ascii wissen. Zuvor hatte ich einen Mips Code ascii zum Konvertieren, aber das Problem hier ist, dass dieser Code nur einen Teil meiner ascii Begriff wandelt, wie dieser (Kommentare für das in deutsch- Entschuldigung):Mips Assembler- So erhalten Sie die Länge eines .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 

Hoffe, du kannst mir einen Hinweis geben.

+1

Es ist unklar, was Sie konvertieren möchten. Das ist eindeutig keine Nummer? – Jester

Antwort

0

Zuerst mißverstanden ich Ihre Frage, aber ich denke immer noch, meine Art von Antwort ist auch Teil der wirklichen Antwort, so zuerst:

Eine Frage sein sollte „, wie Ende der Header zu finden und von Bilddaten beginnen ".

Das letzte Zeichen von PGM header ist "erstes Leerzeichen nach maximalem Grauwert". Sie müssen also den gesamten Header-Wert nach Wert analysieren, bis Sie das Gray-Max analysieren, dann sollte das nächste Byte Leerzeichen sein (32 (Leerzeichen), (TAB), 13 (CR), 10 (LF), 11 (VT), 12 (FF)), dann beginnen die Pixeldaten.

IMHO das ist ziemlich dummes Format, wie ich wette, jemand in DOS produziert ein Bild mit "13, 10" CR + LF nach grau max, aber ... nicht Ihr Problem (oder überprüfen Sie Ihre Datei nach dem Laden in den Speicher, was hat es gelesen).

Und nun zurück zu Ihrer eigentlichen Frage ...

Das erste, was sind diese Daten nicht ASCII. Sie sind binäre Pixeldaten. Ihr "GV" ist bereits zwei Pixel der Werte 71 und 86. Wenn Sie es als ASCII-String anzeigen, dann wird natürlich 71 als "G" angezeigt, aber das ist in keiner Weise relevant. Alles "ASCII" über PGM ist nur die Kopfzeile, nachdem Sie das Ende der Kopfzeile erkannt haben, fließt die Binärdaten ein.

Und die Größe dieser Binärdaten ist width*height*bytes_per_pixel. Bytes_per_pixel ist 1 für gray_max < 256 und 2 für gray_max im Bereich von 256..65535.

Wenn 2 Bytes pro Pixel verwendet werden, ist das höchstwertige Byte das erste Byte (der Wert 4097 ist als Byte codiert: 16, 1 und der Wert 71 ist codiert als: 0, 71).

Wenn Sie eine 0-255 Graustufenbild mit "max grau" im Header auf 255 gesetzt haben, dann lesen Sie einfach die restlichen Bytes der Datei als Binärdaten (nach dem letzten Kopfzeichen), und das war es, diese sind Ihre Pixeldaten Zeile für Zeile von oben nach unten.

Wenn max_gray etwas anderes ist, wie 40 oder 15000, dann ist es fraglich, ob Sie die Pixeldaten irgendwie in 0-255 8 Bit konvertieren sollen (im ersten Fall "upscaling", im zweiten "downscaling"), wahrscheinlich durch eine Gamma-Transformation, wenn dies ein professioneller PGM-Leser sein möchte). Aber ich erwarte, dass Ihre Schulaufgabe nur etwa 0-255 Bilder ohne Implementierung der Gammakorrektur ist.

Verwandte Themen