Premiär! Fyndchans i SweClockers Månadens Drop

[Golang] En sträng är inte en sträng fast den borde vara en sträng när den är typecastad som sträng, sträng?

Permalänk
Medlem

[Golang] En sträng är inte en sträng fast den borde vara en sträng när den är typecastad som sträng, sträng?

Okej, min hjärna fungerar inte alls nuförtiden & det verkar som jag har en Schrödingers sträng; ibland är den en sträng & ibland inte:

Här är all kod, tar inom spoiler för att inte slösa på scrollhjulet/fingret

package main import ( "fmt" "os" "os/exec" "strings" "time" ) type Processor struct{} func (Processor) Write(b []byte) (n int, err error) { s := string(b) fmt.Println(s) // Example output: [download] 12.5 MB if strings.HasSuffix(s, "[download]") { fmt.Println("bläg") } return os.Stdout.Write(b) } func stream() { var stream string = "" // Placeholder removed currentTime := time.Now() var thedate = (currentTime.Format("2006-01-02 (150405)")) cmd := exec.Command(stream + thedate + "m4v") cmd.Stderr = Processor{} if err := cmd.Run(); err != nil { // TODO(Jesper) - if no stream was found, try again in a couple of minutes fmt.Println("No stream found") time.Sleep(10 * time.Second) // TODO(Jesper) - 10s testing only, change to 2 minutes or whatever, or create dev/release build envars stream() } _ = cmd.Run() cmd.Wait() time.Sleep(2 * time.Second) // TODO(Jesper) - If the webcam timed out, wait 2 seconds before reconnecting using stream() recursivly, alternativly handle it in main() stream() // TODO(Jesper) - Recursive stream() or return to main()? } // stream() func main() { stream() }

Dold text

Hämtar en HLS stream vi streamlink i exec.Command, & sen hanterar via en processor, iaf, i func (Processor) vill jag printa lite olika output beroende på output från Stderr/Stout, i exemplet returneras tex "[download] 12.5 MB" när jag laddar ner min stream

Tänkte att detta skulle fungera bra:

s := string(b) fmt.Println(s) // Example output: [download] 12.5 MB if strings.HasSuffix(s, "[download]") { fmt.Println("bläg") }

Nepp:

Så trots att jag konverterar från bytes till string så kan jag inte använda .HasSuffix på s, jag kan alltså inte använda den sträng funktionen direkt på s efter konvertering till string från byte

MEN om jag istället gör en split på strängen:

s := string(b) fmt.Println(s) // Example output: [download] 12.5 MB split := strings.Split(s, " ") if strings.HasSuffix(split[0], "[download]") { fmt.Println("bläg") } else { fmt.Println("Stream could not be found") }

Så där fungerar ju en sträng funktion (strings.Split) så uppenbarligen kan jag använda s som en sträng efter konverteringen? Så, konverteringen från byte till string fungerade ju uppenbarligen men varför kan jag använda strings.Split men inte .strings.HasSuffix på s?

Jag behöver kunna använda .HasSuffix(s, "[download]") för det är inte alltid outputten kan splittas med en delimiter men jag vet att jag alltid får en output med bestämd början som jag kan använda .HasSuffix på (om jag bara får .HasSuffix att fungera på s)

Jag har googlat som en galning & det skall gå, tex: https://stackoverflow.com/questions/40632802/how-to-convert-b...

Men:

s := string(b[:])

fungerar inte heller

Så, snälla, tala om för mig hur/var/varför jag är dum i huvudet? 😁

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem
Skrivet av JesperA:

Okej, min hjärna fungerar inte alls nuförtiden & det verkar som jag har en Schrödingers sträng; ibland är den en sträng & ibland inte:

Här är all kod, tar inom spoiler för att inte slösa på scrollhjulet/fingret

package main import ( "fmt" "os" "os/exec" "strings" "time" ) type Processor struct{} func (Processor) Write(b []byte) (n int, err error) { s := string(b) fmt.Println(s) // Example output: [download] 12.5 MB if strings.HasSuffix(s, "[download]") { fmt.Println("bläg") } return os.Stdout.Write(b) } func stream() { var stream string = "" // Placeholder removed currentTime := time.Now() var thedate = (currentTime.Format("2006-01-02 (150405)")) cmd := exec.Command(stream + thedate + "m4v") cmd.Stderr = Processor{} if err := cmd.Run(); err != nil { // TODO(Jesper) - if no stream was found, try again in a couple of minutes fmt.Println("No stream found") time.Sleep(10 * time.Second) // TODO(Jesper) - 10s testing only, change to 2 minutes or whatever, or create dev/release build envars stream() } _ = cmd.Run() cmd.Wait() time.Sleep(2 * time.Second) // TODO(Jesper) - If the webcam timed out, wait 2 seconds before reconnecting using stream() recursivly, alternativly handle it in main() stream() // TODO(Jesper) - Recursive stream() or return to main()? } // stream() func main() { stream() }

Dold text

Hämtar en HLS stream vi streamlink i exec.Command, & sen hanterar via en processor, iaf, i func (Processor) vill jag printa lite olika output beroende på output från Stderr/Stout, i exemplet returneras tex "[download] 12.5 MB" när jag laddar ner min stream

Tänkte att detta skulle fungera bra:

s := string(b) fmt.Println(s) // Example output: [download] 12.5 MB if strings.HasSuffix(s, "[download]") { fmt.Println("bläg") }

Nepp:
https://i.imgur.com/gJ7ZPrN.png

Så trots att jag konverterar från bytes till string så kan jag inte använda .HasSuffix på s, jag kan alltså inte använda den sträng funktionen direkt på s efter konvertering till string från byte

MEN om jag istället gör en split på strängen:

s := string(b) fmt.Println(s) // Example output: [download] 12.5 MB split := strings.Split(s, " ") if strings.HasSuffix(split[0], "[download]") { fmt.Println("bläg") } else { fmt.Println("Stream could not be found") }

https://i.imgur.com/h62lHjH.png

Så där fungerar ju en sträng funktion (strings.Split) så uppenbarligen kan jag använda s som en sträng efter konverteringen? Så, konverteringen från byte till string fungerade ju uppenbarligen men varför kan jag använda strings.Split men inte .strings.HasSuffix på s?

Jag behöver kunna använda .HasSuffix(s, "[download]") för det är inte alltid outputten kan splittas med en delimiter men jag vet att jag alltid får en output med bestämd början som jag kan använda .HasSuffix på (om jag bara får .HasSuffix att fungera på s)

Jag har googlat som en galning & det skall gå, tex: https://stackoverflow.com/questions/40632802/how-to-convert-b...

Men:

s := string(b[:])

fungerar inte heller

Så, snälla, tala om för mig hur/var/varför jag är dum i huvudet? 😁

Är det jag som är tokig eller *börjar* strängen med [download]? Känns som att HasSuffix funkar fint, men din sträng börjar, inte slutar(!), på [download].
(Utom i split-fallet där du hugger isär strängen så den är exakt "[download]" och då både börjar och slutar på [download])

Finns kanske även en HasPrefix som skulle passa dina syften bättre?

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Är det jag som är tokig eller *börjar* strängen med [download]? Känns som att HasSuffix funkar fint, men din sträng börjar, inte slutar(!), på [download].
(Utom i split-fallet där du hugger isär strängen så den är exakt "[download]" och då både börjar och slutar på [download])

Finns kanske även en HasPrefix som skulle passa dina syften bättre?

Ooops, sorry, råkade byta till HasSuffix när jag testade alla olika möjligheter jag kunde komma på, ursprungligen hade jag .HasPrefix som inte heller fungerar

if strings.HasPrefix(s, "[download]") { fmt.Println("bläg") }

Split versionen: strings.HasSuffix(split[0], "[download]") (och HasPrefix för den delen) fungerar för det är egentligen exakt samma som: if split[0] == "[download]"

Så japp, korrigering: strängen börjar alltså på [download] & .HasPrefix(s, "[download]") fungerar inte heller :/

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem
Skrivet av JesperA:

Ooops, sorry, råkade byta till HasSuffix när jag testade alla olika möjligheter jag kunde komma på, ursprungligen hade jag .HasPrefix som inte heller fungerar

if strings.HasPrefix(s, "[download]") { fmt.Println("bläg") }

Split versionen: strings.HasSuffix(split[0], "[download]") (och HasPrefix för den delen) fungerar för det är egentligen exakt samma som: if split[0] == "[download]"

Så japp, korrigering: strängen börjar alltså på [download] & .HasPrefix(s, "[download]") fungerar inte heller :/

Okej, i så fall skulle ju jag fundera på om det finns något före [

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Något som slår mig när jag tittar på din skärmdump är att [] ser färglagt ut i terminalen(?).
Nu vet ju inte vi andra riktigt vad som pågår eftersom kommandot som spottar ur sig det där är borttaget, men om det typ ligger ANSI-kodsekvenser inbäddade i strängen så lär ju det kunna komplicera det hela...

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk

Nu har jag aldrig utvecklat i Go men jag satte ihop ett litet test och .HasPrefix ska göra det du vill. (om jag nu förstod vad du egentligen ville)
Prova att skriva ut det hexadecimala värdet som kommer in och efter konvertering till en sträng.

https://play.golang.org/p/yscSaBbWgEW
https://play.golang.org/p/01QY4XnT0DM

Som skriver ut
s: [download] 12.5 MB
arr in hex: 5b646f776e6c6f61645d2031322e35204d42
Starts with [download]

package main import ( "fmt" "strings" "encoding/hex" ) func main() { // create a byte array arr := []byte("[download] 12.5 MB") // cast to a string s := string(arr) dst := make([]byte, hex.EncodedLen(len(arr))) hex.Encode(dst, arr) fmt.Printf("s: %s\n", s) fmt.Printf("arr in hex: %s\n", dst) // does the string start with [download]? if strings.HasPrefix(s, "[download]") { fmt.Println("Starts with [download]") } else { fmt.Println("Does not start with [download]") } }

Uppdaterade for att faktiskt skriva ut i hex.
Permalänk
Medlem
Skrivet av evil penguin:

Okej, i så fall skulle ju jag fundera på om det finns något före [

Ja, det är något märkligt tecken framför [ (bracket färgerna kommer från kitty temat, [] är riktiga & normala tecken i strängen)

Gick inte få bort med TrimSpace (eller left/right), så tecknet framför [ är varken newline eller space

Det märkliga tecknet får "lol" att försvinna i

fmt.Println(" lol " + s[0:1] + " vad är detta?")

Concatinerar man en vanlig sträng så fungerar det som det ska:

fmt.Println(" Syns " + hehe + " vad är detta?")

&

fmt.Println(s[1:2])

Ger [

Jag blir inte klok på detta, s[0:1] verkar vara dörren till Narnia

@zoomster2 Tack, skall testa & testa det i min kod/miljö 👍

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem
Skrivet av zoomster2:

Nu har jag aldrig utvecklat i Go men jag satte ihop ett litet test och .HasPrefix ska göra det du vill. (om jag nu förstod vad du egentligen ville)
Prova att skriva ut det hexadecimala värdet som kommer in och efter konvertering till en sträng.

https://play.golang.org/p/yscSaBbWgEW
https://play.golang.org/p/01QY4XnT0DM

Som skriver ut
s: [download] 12.5 MB
arr in hex: 5b646f776e6c6f61645d2031322e35204d42
Starts with [download]

package main import ( "fmt" "strings" "encoding/hex" ) func main() { // create a byte array arr := []byte("[download] 12.5 MB") // cast to a string s := string(arr) dst := make([]byte, hex.EncodedLen(len(arr))) hex.Encode(dst, arr) fmt.Printf("s: %s\n", s) fmt.Printf("arr in hex: %s\n", dst) // does the string start with [download]? if strings.HasPrefix(s, "[download]") { fmt.Println("Starts with [download]") } else { fmt.Println("Does not start with [download]") } }

Testade göra på ditt sätt (ja, din kod fungerar precis som jag vill att den skall göra i "din" sandbox), hos mig fungerar den inte pga okänt tecken för s[0:1]

s[0:1] gör något konstigt i din kod med i min miljö, tar bort "bä bä vita lamm" & börjar först vid "...sång...", kan det okända tecknet vara något i stil med \r?

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem

@JesperA: Din utskrift av dst i hex börjar med:

0d: \r 5b: [ 64: d 6f: o osv.

Så ja, det verkar ju som att du har ett \r i början av strängen.

Permalänk
Medlem
Skrivet av perost:

@JesperA: Din utskrift av dst i hex börjar med:

0d: \r 5b: [ 64: d 6f: o osv.

Så ja, det verkar ju som att du har ett \r i början av strängen.

Vad trött jag blir på mig själv ibland:

Tror min hjärna fastnade på att jag i början felsökte med TrimSpace(s) så jag tog för givet att \n & space & annan bröte var borta när jag testade .HasPrefix med Trim funktionerna.....

Aja, då löste det sig då, tack för hjälpen allihopa, ursäkta krånglet

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?