Potrzebuję przesłać niektóre dane do stdin programu.Wyjściowe dane binarne na potoku PowerShell
- Pierwsze 4 bajty to 32-bitowa liczba całkowita bez znaku reprezentująca długość danych. Te 4 bajty są dokładnie takie same, jak C, które zapisałoby w pamięci unsigned int. Odnoszę się do tego jako danych binarnych.
- Pozostałe bajty są danymi.
w C, to jest trywialne:
WriteFile(h, &cb, 4); // cb is a 4 byte integer
WriteFile(h, pData, cb);
lub
fwrite(&cb, sizeof(cb), 1, pFile);
fwrite(pData, cb, 1, pFile);
lub C# byłoby użyć BinaryWriter (myślę, że ten kod jest w porządku, nie mam C# leżący w tej chwili ...)
Bw.Write((int)Data.Length);
Bw.Write(Data, 0, Data.Length);
W PowerShell jestem pewien, że to możliwe, ale t jego jest tak blisko, jak tylko mogłem. To jest oczywiście drukując 4 bajty wielkości jako 4 ludzkich numerów czytelnych:
$file = "c:\test.txt"
Set-content $file "test data" -encoding ascii
[int]$size = (Get-ChildItem $file).Length
$bytes = [System.BitConverter]::GetBytes($size)
$data = Get-content $file
$bytes
$data
11
0
0
0
test data
muszę danych binarnych wysyłanych na rurze wyglądać następująco (\ xA jest uciekł reprezentacja nieprzestrzegania znaku wydruku , nie chcę „\” w mojej mocy, chcę bajt że „\ xa” oznacza na wyjściu):
\xA\x0\x0\0test data
nie wiem jak napisać tablicę bajtów z rurociągu w format binarny. Nie wiem też, jak pozbyć się powrotów karetki.
EDIT: Odkryłem, że mogę to zrobić:
$file = "c:\test.txt"
Set-content $file "test data" -encoding ascii
"File: ""{0}""" -f (Get-content $file)
[int]$size = (Get-ChildItem $file).Length
"Size: " + $size
$bytes = [System.BitConverter]::GetBytes($size)
"Bytes: " + $bytes
$data = Get-content $file
$file1 = "c:\test1.txt"
Set-content $file1 $bytes -encoding byte
Add-Content $file1 $data -encoding ASCII
"File: ""{0}""" -f (Get-content $file1)
"Size: " + (Get-ChildItem $file1).Length
File: "test data"
Size: 11
Bytes: 11 0 0 0
File: " test data"
Size: 15
Wymaga to jednak mnie zbudować plik tymczasowy. Musi istnieć lepszy sposób!
EDYTOWANIE: Powyższe rozwiązanie powoduje uszkodzenie dowolnego kodu znaku> 127. Nie ma trybu kodowania "binarnego" dla potoku.
EDIT: I wreszcie odkrył okrężną drogą, aby uzyskać BinaryWriter przewodowy do danej aplikacji stdin. Zobacz moją odpowiedź.
* Westchnienie * za co spadł? Mam 2063 punktów za przyczynianie się, więc nie jestem pasożytem. To nie jest zadanie domowe, głównie dlatego, że przez 20 lat nie byłem w szkole. Co daje? – johnnycrash
Pierwsze 4 bajty to długość czego? A co rozumiesz przez "długość w binarnej"? –
Pierwsze 4 bajty to długość kolejnych danych. Długość danych jest zawarta w 32-bitowej liczbie całkowitej. Długość musi być zakodowana w systemie binarnym. Jeśli więc długość przesyłanych danych wynosi 10, pierwsze 4 bajty będą wynosić 0 00 00 00. Następnie pojawi się 10 bajtów danych. – johnnycrash