Ho bisogno di unire alcuni dati allo stdin di un programma.Dati binari di output sulla pipeline PowerShell
- I primi 4 byte sono un numero intero senza segno a 32 bit che rappresenta la lunghezza dei dati. Questi 4 byte sono esattamente come C memorizzerebbe un int unsigned in memoria. Mi riferisco a questo come dati binari.
- I byte rimanenti sono i dati.
in C, questo è banale:
WriteFile(h, &cb, 4); // cb is a 4 byte integer
WriteFile(h, pData, cb);
o
fwrite(&cb, sizeof(cb), 1, pFile);
fwrite(pData, cb, 1, pFile);
o C# si userebbe un BinaryWriter (credo che questo codice è giusto, non ho C# sdraiato intorno in questo momento ...)
Bw.Write((int)Data.Length);
Bw.Write(Data, 0, Data.Length);
In PowerShell sono sicuro che è possibile, ma t il suo è il più vicino possibile. Questa è ovviamente la stampa dei 4 byte di dimensioni come 4 numeri leggibili:
$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
ho bisogno dei dati binari inviati sul tubo a guardare come questo (\ XA è la rappresentazione sfuggito di un carattere non stampabile , non voglio che '\' nella mia uscita, voglio che il bYTE che '\ xA' rappresenta in uscita):
\xA\x0\x0\0test data
non so come scrivere un array di byte la pipeline in formato binario. Inoltre, non so come sbarazzarmi dei ritorni in carrozza.
EDIT: Ho trovato che posso fare questo:
$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
Ma questo mi impone di costruire un file temporaneo. Ci deve essere un modo migliore!
EDIT: Tale soluzione sopra, corrompe qualsiasi codice di carattere> 127. Non v'è alcun modo di codifica "binaria" per il tubo.
EDIT: ho finalmente scoperto un modo indiretto per ottenere una BinaryWriter cablata fino a stdin di un app. Vedi la mia risposta.
* sospiro * qual è stato il downvote per? Ho 2063 punti per contribuire, quindi non sono un parassita. Questa non è una domanda a casa, principalmente perché sono stato fuori dalla scuola per 20 anni. Quindi cosa dà? – johnnycrash
I primi 4 byte sono la lunghezza di cosa? E cosa intendi con "length in binary"? –
I primi 4 byte corrispondono alla lunghezza dei dati successiva. La lunghezza dei dati è contenuta in un numero intero a 32 bit. La lunghezza deve essere codificata in binario. Quindi se la lunghezza dei dati trasmessi è 10, i primi 4 byte saranno 0A 00 00 00. Quindi seguiranno i 10 byte di dati. – johnnycrash