digitalmars.D.learn - Reading bytes and converting to int
- joao (9/9) Aug 25 2012 Hello everyone, I recently discovered the D language.
- nazriel (2/11) Aug 25 2012 Maybe std.bitmanip.peek could help?
- David (3/12) Aug 25 2012 I think that is what you need/want:
- cal (4/13) Aug 25 2012 auto i = cast(ubyte[])std.file.read("filename");
- joao (9/9) Aug 25 2012 Thanks everyone, I solved the problem.
- Jonathan M Davis (14/25) Aug 25 2012 What's hard to understand about them? I thought that they were very
- joao (15/42) Aug 25 2012 It's not hard, sorry, it's because I'm a begginner.
- David (3/46) Aug 25 2012 File f = File("filename");
- Jonathan M Davis (11/25) Aug 25 2012 I believe that this will work;
- joao (15/44) Aug 25 2012 Ok, so I tried both ways and gave errors:
- Jonathan M Davis (11/28) Aug 25 2012 Then either don't import both or use the full import.
- joao (5/36) Aug 25 2012 It worked! Thanks.
- Jonathan M Davis (4/7) Aug 25 2012 Use std.bitmanip.write:
- Tommi (22/23) Aug 26 2012 Could we somehow skip making the temporary buffer, and read from
- Timon Gehr (2/23) Aug 26 2012
- Tommi (4/5) Aug 26 2012 Thanks. Oughta read the f***ing manual instead of glancing
Hello everyone, I recently discovered the D language. So, I want to open a file a read 4 bytes and get the int value. string bytes = f.read(4) I tried to cast but give me message it was deprecated. uint value = cast (uint) bytes If bytes was for example, "\x24\x00\x00\x00" I would like to value to be 0x24. I know how to do this in Python, it is done with struct.unpack. Thanks.
Aug 25 2012
On Saturday, 25 August 2012 at 15:23:45 UTC, joao wrote:Hello everyone, I recently discovered the D language. So, I want to open a file a read 4 bytes and get the int value. string bytes = f.read(4) I tried to cast but give me message it was deprecated. uint value = cast (uint) bytes If bytes was for example, "\x24\x00\x00\x00" I would like to value to be 0x24. I know how to do this in Python, it is done with struct.unpack. Thanks.Maybe std.bitmanip.peek could help?
Aug 25 2012
Am 25.08.2012 17:23, schrieb joao:Hello everyone, I recently discovered the D language. So, I want to open a file a read 4 bytes and get the int value. string bytes = f.read(4) I tried to cast but give me message it was deprecated. uint value = cast (uint) bytes If bytes was for example, "\x24\x00\x00\x00" I would like to value to be 0x24. I know how to do this in Python, it is done with struct.unpack. Thanks.I think that is what you need/want: http://dlang.org/phobos/std_bitmanip.html#read
Aug 25 2012
On Saturday, 25 August 2012 at 15:23:45 UTC, joao wrote:Hello everyone, I recently discovered the D language. So, I want to open a file a read 4 bytes and get the int value. string bytes = f.read(4) I tried to cast but give me message it was deprecated. uint value = cast (uint) bytes If bytes was for example, "\x24\x00\x00\x00" I would like to value to be 0x24. I know how to do this in Python, it is done with struct.unpack. Thanks.auto i = cast(ubyte[])std.file.read("filename"); int val = std.bitmanip.read!(int, std.system.Endian.littleEndian)(i)
Aug 25 2012
Thanks everyone, I solved the problem. I didn't understand these bitmanip methods so I searched and found a function to do what I wanted: string b = "\x24\x10\x00\x00"; uint i = byteToInt(b); uint byteToInt(string b) { return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24; } => 4132
Aug 25 2012
On Saturday, August 25, 2012 21:50:58 joao wrote:Thanks everyone, I solved the problem. I didn't understand these bitmanip methods so I searched and found a function to do what I wanted: string b = "\x24\x10\x00\x00"; uint i = byteToInt(b); uint byteToInt(string b) { return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24; } => 4132What's hard to understand about them? I thought that they were very straightforward. This will do essentially the same thing: import std.bitmanip; import std.system; void main() { ubyte[] b = [0x24, 0x10, 0x00, 0x00]; auto i = peek!(uint, Endian.littleEndian)(b); assert(i == 4132); } Use peek if you don't want to consume the buffer and read if you do. - Jonathan M Davis
Aug 25 2012
On Saturday, 25 August 2012 at 20:03:38 UTC, Jonathan M Davis wrote:On Saturday, August 25, 2012 21:50:58 joao wrote:It's not hard, sorry, it's because I'm a begginner. So, all I wanted to do was to open a file and read the first 4 bytes and then return the int value. The last part I managed to do. But the first I'm trying. In Python it is something like this: f = open('filename') s = f.read(4) ... In D I don't know yet. I'm trying to do: File f = File('filename') Then I want to read just 4 bytes. I still don't know what method is :PThanks everyone, I solved the problem. I didn't understand these bitmanip methods so I searched and found a function to do what I wanted: string b = "\x24\x10\x00\x00"; uint i = byteToInt(b); uint byteToInt(string b) { return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24; } => 4132What's hard to understand about them? I thought that they were very straightforward. This will do essentially the same thing: import std.bitmanip; import std.system; void main() { ubyte[] b = [0x24, 0x10, 0x00, 0x00]; auto i = peek!(uint, Endian.littleEndian)(b); assert(i == 4132); } Use peek if you don't want to consume the buffer and read if you do. - Jonathan M Davis
Aug 25 2012
Am 25.08.2012 22:18, schrieb joao:On Saturday, 25 August 2012 at 20:03:38 UTC, Jonathan M Davis wrote:File f = File("filename"); auto buf = f.rawRead(new ubyte[4]);On Saturday, August 25, 2012 21:50:58 joao wrote:It's not hard, sorry, it's because I'm a begginner. So, all I wanted to do was to open a file and read the first 4 bytes and then return the int value. The last part I managed to do. But the first I'm trying. In Python it is something like this: f = open('filename') s = f.read(4) ... In D I don't know yet. I'm trying to do: File f = File('filename') Then I want to read just 4 bytes. I still don't know what method is :PThanks everyone, I solved the problem. I didn't understand these bitmanip methods so I searched and found a function to do what I wanted: string b = "\x24\x10\x00\x00"; uint i = byteToInt(b); uint byteToInt(string b) { return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24; } => 4132What's hard to understand about them? I thought that they were very straightforward. This will do essentially the same thing: import std.bitmanip; import std.system; void main() { ubyte[] b = [0x24, 0x10, 0x00, 0x00]; auto i = peek!(uint, Endian.littleEndian)(b); assert(i == 4132); } Use peek if you don't want to consume the buffer and read if you do. - Jonathan M Davis
Aug 25 2012
On Saturday, August 25, 2012 22:18:50 joao wrote:It's not hard, sorry, it's because I'm a begginner. So, all I wanted to do was to open a file and read the first 4 bytes and then return the int value. The last part I managed to do. But the first I'm trying. In Python it is something like this: f = open('filename') s = f.read(4) ... In D I don't know yet. I'm trying to do: File f = File('filename') Then I want to read just 4 bytes. I still don't know what method is :PI believe that this will work; import std.stdio; auto file = File("filename"); auto buffer = ubyte[](4); buffer = file.rawRead(buffer); rawRead will read in the type given, and it will read up to the number of elements given (less if the file is shorter). If the elements are ubyte, then the length of the array before passing it in will be the number of bytes to read, and the length of the result is the number of bytes read. - Jonathan M Davis
Aug 25 2012
On Saturday, 25 August 2012 at 20:31:22 UTC, Jonathan M Davis wrote:On Saturday, August 25, 2012 22:18:50 joao wrote:Ok, so I tried both ways and gave errors: import std.stdio, std.cstream, std.system, std.bitmanip; File f = File("filename"); auto buf = f.rawRead(new ubyte[4]); auto i = peek!(uint, Endian.littleEndian)(buf); std.stdio.File conflicts with std.stream.File and auto file = File("filename"); auto buffer = ubyte[](4); buffer = file.rawRead(buffer); auto i = peek!(uint, Endian.littleEndian)(buffer); found '[' when expecting '.' following ubyte and ']' when expecting identifier following 'ubyte'It's not hard, sorry, it's because I'm a begginner. So, all I wanted to do was to open a file and read the first 4 bytes and then return the int value. The last part I managed to do. But the first I'm trying. In Python it is something like this: f = open('filename') s = f.read(4) ... In D I don't know yet. I'm trying to do: File f = File('filename') Then I want to read just 4 bytes. I still don't know what method is :PI believe that this will work; import std.stdio; auto file = File("filename"); auto buffer = ubyte[](4); buffer = file.rawRead(buffer); rawRead will read in the type given, and it will read up to the number of elements given (less if the file is shorter). If the elements are ubyte, then the length of the array before passing it in will be the number of bytes to read, and the length of the result is the number of bytes read. - Jonathan M Davis
Aug 25 2012
On Saturday, August 25, 2012 22:49:18 joao wrote:Ok, so I tried both ways and gave errors: import std.stdio, std.cstream, std.system, std.bitmanip; File f = File("filename"); auto buf = f.rawRead(new ubyte[4]); auto i = peek!(uint, Endian.littleEndian)(buf); std.stdio.File conflicts with std.stream.FileThen either don't import both or use the full import. auto file = std.stdio.File("filename"); But I wouldn't advise using std.stream for anything unless you have to. As the note in its documentation states, it's considered out-of-date and will be replaced.and auto file = File("filename"); auto buffer = ubyte[](4); buffer = file.rawRead(buffer); auto i = peek!(uint, Endian.littleEndian)(buffer); found '[' when expecting '.' following ubyte and ']' when expecting identifier following 'ubyte'It's missing new. My mistake. auto buffer = new ubyte[](4); or as David pointed out, you get just allocate the array in the rawRead call: auto buf = file.rawRead(new ubyte[](4)); - Jonathan M Davis
Aug 25 2012
On Saturday, 25 August 2012 at 20:58:47 UTC, Jonathan M Davis wrote:On Saturday, August 25, 2012 22:49:18 joao wrote:It worked! Thanks. Just one more question, I and to do the reverse. Like 4132 => "\x24\x10"Ok, so I tried both ways and gave errors: import std.stdio, std.cstream, std.system, std.bitmanip; File f = File("filename"); auto buf = f.rawRead(new ubyte[4]); auto i = peek!(uint, Endian.littleEndian)(buf); std.stdio.File conflicts with std.stream.FileThen either don't import both or use the full import. auto file = std.stdio.File("filename"); But I wouldn't advise using std.stream for anything unless you have to. As the note in its documentation states, it's considered out-of-date and will be replaced.and auto file = File("filename"); auto buffer = ubyte[](4); buffer = file.rawRead(buffer); auto i = peek!(uint, Endian.littleEndian)(buffer); found '[' when expecting '.' following ubyte and ']' when expecting identifier following 'ubyte'It's missing new. My mistake. auto buffer = new ubyte[](4); or as David pointed out, you get just allocate the array in the rawRead call: auto buf = file.rawRead(new ubyte[](4)); - Jonathan M Davis
Aug 25 2012
On Sunday, August 26, 2012 01:25:04 joao wrote:It worked! Thanks. Just one more question, I and to do the reverse. Like 4132 => "\x24\x10"Use std.bitmanip.write: http://dlang.org/phobos/std_bitmanip.html#write - Jonathan M Davis
Aug 25 2012
On Saturday, 25 August 2012 at 20:58:47 UTC, Jonathan M Davis wrote:auto buf = file.rawRead(new ubyte[](4));Could we somehow skip making the temporary buffer, and read from the file directly into an existing variable. Can we make a slice of one element that points to an existing value. import std.stdio; struct BigValue // has no indirection { int m_value1; int m_value2; long m_value3; // ... } BigValue g_bigValue; void fun() { auto file = File("filename"); // How to create a slice of size 1 which references g_bigValue? BigValue[] refToBigValue /* = ? */ ; buffer = file.rawRead(refToBigValue); }
Aug 26 2012
On 08/26/2012 04:19 PM, Tommi wrote:On Saturday, 25 August 2012 at 20:58:47 UTC, Jonathan M Davis wrote:auto refToBigValue = (&g_bigValue)[0..1];auto buf = file.rawRead(new ubyte[](4));Could we somehow skip making the temporary buffer, and read from the file directly into an existing variable. Can we make a slice of one element that points to an existing value. import std.stdio; struct BigValue // has no indirection { int m_value1; int m_value2; long m_value3; // ... } BigValue g_bigValue; void fun() { auto file = File("filename"); // How to create a slice of size 1 which references g_bigValue? BigValue[] refToBigValue /* = ? */ ;buffer = file.rawRead(refToBigValue); }
Aug 26 2012
On Sunday, 26 August 2012 at 15:18:27 UTC, Timon Gehr wrote:auto refToBigValue = (&g_bigValue)[0..1];Thanks. Oughta read the f***ing manual instead of glancing through it: http://dlang.org/arrays.html
Aug 26 2012