Opakowanie długość rekordu w 2 bajtach

głosy
1

Chcę utworzyć ciąg ASCII, które będą miały liczbę pól. np

string s = f1 + | + f2 + | + f3;

F1, F2, F3, to pola i | (rura) jest separator. Chcę uniknąć tego ogranicznika i utrzymać liczbę pól na początku jak:

string s = f1.Length + f2.Length + f3.Length + f1 + f2 + f3;

Wszystkie odcinki będą pakowane w 2 znaków, długość max = 00-99 w tym przypadku. Zastanawiałem się, czy mogę zapakować długość każdego pola w 2 bajtach przez ekstrakcję bajtów z krótkiej. To pozwoli mi mieć zakres 0-65536 używając tylko 2 bajty. Na przykład

short length = 20005;
byte b1 = (byte)length;
byte b2 = (byte)(length >> 8);
// Save bytes b1 and b2

// Read bytes b1 and b2
short length = 0;
length = b2;
length = (short)(length << 8);
length = (short)(length | b1);
// Now length is 20005

Co sądzisz o powyższym kodzie, Czy to dobry sposób na utrzymanie długości rekordu?

Utwórz 31/03/2011 o 13:42
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
1

Nie widzę, co staramy się osiągnąć. shortaka Int16jest 2 bajty - tak, aby można było używać go szczęśliwie. Ale tworząc ciąg nie ma sensu.

short sh = 56100; // 2 bytes

Wierzę, że masz na myśli, będąc w stanie wyjściu z shortdo strumienia. Do tego istnieją sposoby:

  • BinaryWriter.Write(sh) który pisze 2 bajty prosto do strumienia
  • BitConverter.GetBytes(sh) który daje bajtach short

Czytanie z powrotem można używać tych samych klas.

Odpowiedział 31/03/2011 o 13:47
źródło użytkownik

głosy
0

Jeśli chcesz ASCII , czyli „00” jako znaki , a potem po prostu:

byte[] bytes = Encoding.Ascii.GetBytes(length.ToString("00"));

czy można zoptymalizować go, jeśli chcesz.

Ale IMO, jeśli przechowywania 0-99, 1 bajt jest mnóstwo:

byte b = (byte)length;

Jeśli chcesz zakresu 0-65535, a potem po prostu:

bytes[0] = (byte)length;
bytes[1] = (byte)(length >> 8);

lub indeks wymiany 0 i 1 dla bajt.

Ale jeśli używasz pełnego zakresu (z każdej pojedynczej lub podwójnej bajt), to nie jest ascii ani ciągiem. Wszystko, co stara się go odczytać jako ciąg może zakończyć się niepowodzeniem.

Odpowiedział 31/03/2011 o 13:50
źródło użytkownik

głosy
0

Czy to dobry pomysł, zależy od szczegółów, co to jest za, ale nie jest prawdopodobne, aby być dobrym.

Jeśli to zrobisz to jesteś już tworząc „ciąg ASCII”. To były twoje słowa, ale być może tak naprawdę nie obchodzi, czy to ASCII.

Czasem się bajty o wartości 0 w swoim „string”. Jeśli obsługa sznurki z niczego napisanego w C, może to spowodować problemy. Otrzymasz również wszelkiego rodzaju inne znaki - znaki nowej linii, zakładek, przecinków itp - które mogą mylić oprogramowanie, które stara się pracować z danymi.

Pierwotny plan wydzielenia z (powiedzmy) |znaków będą bardziej zwarte i łatwiejsze dla ludzi i programy do odczytu. Jedyne wady są oczywiste (1) nie można zezwolić na wartości pola z |(albo jeszcze trzeba jakąś ucieczkę) i (2) parsowanie będzie nieznacznie wolniej.

Odpowiedział 31/03/2011 o 13:50
źródło użytkownik

głosy
0

Jeśli chcesz uzyskać mądry można spakować 2 bajty do 1, gdzie wartość 1 bajt jest <= 127, lub jeśli wartość wynosi> = 128 użyć 2 bajty zamiast. Technika ta traci ci 1 bit, na bajt, którego używasz, ale jeśli zazwyczaj mają małe wartości, ale od czasu do czasu mieć większe wartości dynamicznie rośnie w celu dostosowania wartości.

Wszystko, co musisz zrobić, to znak bit 8 z wartością wskazującą, że 2nd bajt jest wymagana do odczytu. Jeśli bit 8 aktywnego bajt nie jest ustawiony, oznacza to, że masz ukończone swoją wartość.

EG Jeśli masz wartość 4, a następnie użyć tego

|8|7|6|5|4|3|2|1|
|0|0|0|0|0|1|0|0|

Jeśli mają wartość 128 następnie może odczytać bajt 1st czek jeśli bit 8 jest wysoka, a czytać pozostałych 7 bitów 1 bajt, a następnie zrobić to samo z 2 bajt, przesuwając 7bits pozostawione 7 bitów.

|BYTE 0         |BYTE 1         |
|8|7|6|5|4|3|2|1|8|7|6|5|4|3|2|1|
|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|
Odpowiedział 04/04/2011 o 01:05
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more