Jump to page: 1 2
Thread overview
Reading bytes and converting to int
Aug 25, 2012
joao
Aug 25, 2012
nazriel
Aug 25, 2012
David
Aug 25, 2012
cal
Aug 25, 2012
joao
Aug 25, 2012
Jonathan M Davis
Aug 25, 2012
joao
Aug 25, 2012
David
Aug 25, 2012
Jonathan M Davis
Aug 25, 2012
joao
Aug 25, 2012
Jonathan M Davis
Aug 25, 2012
joao
Aug 26, 2012
Jonathan M Davis
Aug 26, 2012
Tommi
Aug 26, 2012
Timon Gehr
Aug 26, 2012
Tommi
August 25, 2012
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.
August 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?

August 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
August 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)


August 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
August 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;
> }
> 
> => 4132

What'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
August 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:
>> 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
>
> What'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

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 :P
August 25, 2012
Am 25.08.2012 22:18, schrieb joao:
> On Saturday, 25 August 2012 at 20:03:38 UTC, Jonathan M Davis wrote:
>> 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;
>>> }
>>>
>>> => 4132
>>
>> What'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
>
> 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 :P

File f = File("filename");
auto buf = f.rawRead(new ubyte[4]);
August 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 :P

I 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
August 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:
>> 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 :P
>
> I 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

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'
« First   ‹ Prev
1 2