Avatar billede iceyblue Nybegynder
10. marts 2004 - 10:34 Der er 19 kommentarer og
1 løsning

MS VS.NET 2003 ASCII-værdier ændres??

Hej!!
Jeg sidder og arbejder i MS VS.NET 2003, da jeg er i gang med at lave et program som kan bearbejde ASCII-tegn fra en maskine via en seriel-forbindelse.

Jeg har lavet et string-array på 256pladser som indeholder alle ASCII-tegn.

Problemet er at disse ASCII-tegn ændrer sig i filen, hver gang jeg lukke ret projekt ned og åbner det igen. Dvs. at tegnene bliver lavet om til andre tegn. evt flere plus-tegn m.m. Måske er det især ASCII-tegn med index over 128..jeg ved det ikke helt. Det ser mærkeligt ud!

Hvorfor bliver tegnene lavet om????

Arrayet befinder sig i en .cs -fil.
Jeg har tænkt på at smide data ud i en fil og så hente det ind i arrayet...men dette synes jeg ikke vil være den bedste løsning.
Avatar billede arne_v Ekspert
10. marts 2004 - 10:56 #1
Du er klar over at C# chars er 16 bit d.v.s. at der er 65536 værdier.

Non printable tegn bør laves med escape.

En streng med tegn 0-255 bliver derfor:

"\u0000\u0001...\u00FF"
Avatar billede iceyblue Nybegynder
10. marts 2004 - 11:21 #2
Hej Arne...
Jeg tror ikke at jeg forstå det helt?? Hvad skal jeg gøre... må jeg ikke lægge ASCII-tegn som: ▀▐ßασ i mit array??

Jeg har lavet en metode som modtager en int(dvs. den ønskede ascii-værdi's decimale repræsentation) og returnerer den korrekte ascii-værdi som en string.

Hvad vil det sige at tegn som kan ikke printes bør laves med escape?
Avatar billede iceyblue Nybegynder
10. marts 2004 - 11:23 #3
Jeg prøvede at lave nogle ascii-tegn men eksperten har lavet dem om til: ▀▐ßα&#963. Bare så du ved det.
Avatar billede arne_v Ekspert
10. marts 2004 - 11:28 #4
ASCII er 0-127 d.v.s. ikke ÆØÅ etc.

ISO-8859-1 alias CP-1252 er 0-255 og har ÆØÅ

UNICODE er 0-65535

UNICODE kan encodes som UTF-8

int er et binært tal ikke en decimal repræsentation
Avatar billede arne_v Ekspert
10. marts 2004 - 11:30 #5
Hvis du skal have en string med alle tegn 0-255, så bør du bruge escape:

string s = "\u0000\u0001...\u00FF";

(sæt selv de 253 tegn ind hvor de 3 punktummer er)
Avatar billede iceyblue Nybegynder
10. marts 2004 - 11:44 #6
...jeg mente IKKE den indbyggede og kendte type "decimal" men vores normale 10-talssystem.

Hvorfor skal jeg skrive \uxxxx??? hvorfor må jeg ikke bare skrive tallene ved at holde venstre ALT nede og så trykke ASCII-nummeret??? Det kan jeg ikke forstå! :(
Avatar billede arne_v Ekspert
10. marts 2004 - 12:01 #7
Det gjorde jeg også.

Ved at indsætte non-printable karakterer i kilde teksten kan du opleve
mange sjove problemer. Derfor har Microsoft lavet muligheden med \uxxxx.
Avatar billede arne_v Ekspert
10. marts 2004 - 12:01 #8
Prøv det !
Avatar billede iceyblue Nybegynder
10. marts 2004 - 12:05 #9
Jeg er lidt forvirretmht. de her tegn og tabeller.

Jeg har undret mig meget over hvorfor forskellige programmer som analysere tegn på COMporten, hver især kan finde på at vise forskellige ASCII-tegn på det samme inkommende data? Det er som om at nogle programmer bruger en slags tegn til at repræsentere ASCII og et andet nogle andre tegn???

Du skriver at ASCII-tabellen maks er 127. Det forstår jeg, men man regner vel også de extended'e ASCII-værdier med. så går ascii til 255.
Avatar billede arne_v Ekspert
10. marts 2004 - 12:14 #10
Der er selvfølgelig også bytes med værdier 128-255.

Men fortolkningen af dem afhænger af om man bruger CP-850 (DOS tegn sæt),
ISO-8859-1/CP-1252 (ANSI/Windows tegn sæt) eller UTF-8.
Avatar billede iceyblue Nybegynder
10. marts 2004 - 12:24 #11
Ok.
Det jeg gerne vil er at kunne modtage en lang række ASCII-tegn fra en maskine og gemme dem i én lang string for senere at kunne lave hver eneste ASCII-tegn om til det decimale nummer (0-255), da ASCII-tegnene repræsenterer værdier der skal bruges til at tegne en graf på pc'en.

Hvordan gør jeg dette bedst?
Det er vigtigt at hvert eneste modtaget ASCII-tegn bliver gemt med en fast størrelse/længde og helst som "det rene" ASCII-tegn.

Lige nu gemmer jeg diverse ASCII-tegn i mit array som strings, men vil det ikke være muligt at gemme dem som de rigtige/originale ét-tegns ASCII-værdier (eller unicode).

Det ville være lettest hvis de kun fyldte én karakter hver, da jeg så kan følge den oprindelige maskineprotokols længde for hvert eneste parameter. Da protokollen jo selvfølgelig afsætter en fast størrelse til at repræsentere de værdier/parametre den indeholder.
Avatar billede arne_v Ekspert
10. marts 2004 - 12:45 #12
Hvis du læser en int så har den "rigtige" værdi.

Mit gæt vil være at du leder efter noget som:

StringBuilder sb = new StringBuilder();
så længe der er mere data
{
  int c = læs int fra port;
  sb.Append((char)c);
}
Avatar billede iceyblue Nybegynder
10. marts 2004 - 13:07 #13
øøhm...

1. Jeg er interesseret i at vide, hvilken type mit array skal være af(evt. ASCII, unikode eller?), når jeg gerne vil bevare de "rigtige" ASCII værdier(når jeg har lagt dem ind i arrayet), samt let kunne konvertere dem tilbage igen til deres ASCII nr. i ASCII-tabellen.

2. Hvad er forskellen på StringBuilder sb = new StringBuilder();
                                      sb.Append...
og

...
string alleModtagetTegn  = "";
string modtagetTegn = "";
alleModtagetTegn += modtagetTegn;
...
Avatar billede iceyblue Nybegynder
10. marts 2004 - 13:13 #14
HOV!

kom lige i tanke om...

jeg kan vel blot konverterer den byte som min metode nu engang modtager til en char(dermed har jeg vel nu unikode-værdien?)...og hvis jeg så senere ønsker at konvertere denne værdi til nr. i ASCII tabellen - kan jeg vel blot parse char'en til en int...ikke sandt??

Eller har jeg helt misforstået noget her...?
Avatar billede arne_v Ekspert
10. marts 2004 - 13:14 #15
re 1)

byte array til 8 bit værdier 0-255
char array til 16 bit værdier 0-65535

både byte og char kan type castes til int

re 2)

Bare en anden måde at gøre det på.

(en bedre måde hvis du skal appende millioner af gange)
Avatar billede arne_v Ekspert
10. marts 2004 - 13:15 #16
Du kan assigne/typecaste mellem byte,char,int.
Avatar billede iceyblue Nybegynder
10. marts 2004 - 17:26 #17
Hej!!
Jeg har nu lavet mit array om, som du foreslog.

char [] fraDecTilASCII = new char[256];
               
                fraDecTilASCII[0] ='\u0000';
                fraDecTilASCII[1] ='\u0001';
                fraDecTilASCII[2] ='\u0002';
                fraDecTilASCII[3] ='\u0003';
                fraDecTilASCII[4] ='\u0004';
                                        .....

Min metode modtager bytes fra maskinen som identificeres via arrayet. Det kan godt være at det er unicode, men oprindelig har jeg tænk det som ascii.....derfor har array'et det navn.

Det er mig en "gåde" hvorfor nogle tegn udskrives som "firkanter". Det ser ud til at være tilfældige tal???? Disse "firkanter" kan jeg ikke finde i ascii-tabellen eller unicode for den sags skyld???

Har du et bud på hvorfor de kommer frem, når jeg udskriver alle tegnene i en tekstbox??
Avatar billede arne_v Ekspert
10. marts 2004 - 18:12 #18
Tegnene 0-31 og 128-159 kan ikke vises
Avatar billede iceyblue Nybegynder
11. marts 2004 - 11:27 #19
Hej Arne!!!
1000 tak for din hjælp...du har lige hjulpet mig igennem problemet efter 3 dages arbjde med fejl og frustration ;)

Nu mens jeg har din opmærksomhed....ved du så hvordan man indsætter et OLE objekt i en Crystal Report? Dvs. mit egentlig problem er, at få indsat et word eller pfd doc. som både indholder tekst og billeder, men således at den automatisk deler dokumentet op i 50 sider, hvis det nu engang er så langt. Hvis jeg indsætter et rent tekst doc. i et tekst-objekt opdeler den nemlig selv dokumentet i de nødvendige antal sider.

Du får 200 points hvis du kan hjælpe mig!!!

mvh. IceyBlue
Avatar billede arne_v Ekspert
11. marts 2004 - 11:52 #20
Desværre - jeg har aldrig arbejdet med Crystal Reports.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester