Merhaba,
Şimdi hızlı bir turla ikilik sistemden girip UTF'den çıkacağız; koltuklarınıza yaslanabilirsiniz 😀
İkilik tabandaki bir sayının en sağdaki biti en az anlamlı bit (LSB, çoğulsa LSBs) olarak adlandırılırken, en solundaki biti en anlamlı bit (MSB, çoğulsa MSBs) olarak bilinir. İngilizce karşılıkları ise hemen altta:
>The right most bit of a binary number is
called least-significant bit (LSB) while
the left most bit of a binary number is
known as the most-significant bit (MSB).
enum : char { // 8'er bit veri
D = 0x44,
_ = 0x20,
L = 0x4c,
A = 0x41,
N = 0x4e,
G = 0x47
}
import std.stdio;
void main()
{
wchar[] dataW = [ D, _, L, A, N, G ];
dataW.writefln!"%(%08X\n%)";
} /* ÇIKTISI:
00000044
00000020
0000004C
00000041
0000004E
00000047
*/
Yukardaki gibi her elemanın/karakterin 4 bayt yer kapladığı (dataW dizisi, yani UTF32 türünde) bir verimiz olsun. Her ne kadar wchar 32 bit olsa da, dizi kurulurken aktarılan bilgi char olduğundan en sağdaki bitler (LSBs) içinde temsil edilir. Bunu zaten anlamlarıyla ilişkili çıktıdaki düz sıralamada (Big-endianness) görmekteyiz.
Aşağıdaki alıntıda belirtildiği gibi, ağ iletişimlerinde baskın olan bu dizilimken, işlemci ve bellek mimarilerinde ters sıralama (Little-endianness) baskındır. İş dosyalara gelince her ikisi de karışık olarak kullanılır.
>Big-endianness is the dominant ordering in networking protocols, such as in the internet protocol suite, where it is referred to as network order, transmitting the most significant byte first. Conversely, little-endianness is the dominant ordering for processor architectures (x86, most ARM implementations, base RISC-V implementations) and their associated memory. File formats can use either ordering; some formats use a mixture of both or contain an indicator of which ordering is used throughout the file.
Hatta ağ iletişiminden sorumlu bazı donanımlar, bu anlattıklarımızdan birini rasgele seçip kullandığı karışık mode da varmış ama konumuz dışındadır.
Bu kısa girişten sonra (bu sadece özetti, daha çok bilgi internette mevcut!), anlattıklarımızı güzel bir örnekle şerbetleyelim:
import std.stdio, std.conv;
import std.algorithm, std.range;
union uintToBytes {
uint data; // 4 bytes
byte[4] s; // segments
}
auto merge(R)(R range) {
uintToBytes convert;
scope(exit) convert.data.writefln!"%032b";
// if range is string, dchar[]
// if range is File, ubyte[]
foreach(i, uint c; range.array) {/*
int i = -1;
foreach_reverse(uint c; range.array) {
i++;//*/
convert.data |= c << (i * 8);
}
return convert.s;
}
void main()
{
enum text ="D LANG99";
auto f = File("text.dat", "w+");
text.chunks(4)
.each!(bytes =>
f.rawWrite(bytes.merge)/*
f.rawWrite(bytes.to!string)//*/
);
writeln("The head is rewind...");
f.rewind;
auto data = f.rawRead(new byte[](text.length));
data.chunks(4)
.each!(bytes =>
bytes.merge.writefln!"%(0x%02x %)"/*
bytes.writefln!"%(0x%02x\n%)"//*/
);
string test;
foreach(char c; data) {
test ~= c;
c.writef!"%s";
}
assert(test == text);
"\n".writeln("\u2713 TEST OK!");
} /* ÇIKTISI:
01000001010011000010000001000100
00111001001110010100011101001110
The head is rewind...
01000001010011000010000001000100
0x44 0x20 0x4c 0x41
00111001001110010100011101001110
0x4e 0x47 0x39 0x39
D LANG99
✓ TEST OK!
*/
Başarılar...