2012-05-09 43 views
6

Tôi đang sử dụng một MemoryStream để xây dựng một mảng byte tôi cần phải gửi đến một server.I có thre câu hỏi:MemoryStream và xây dựng một mảng byte

1) Có cách nào tốt hơn để xây dựng một loạt các byte hơn thế này?

2) Tại sao mã pice này viết không có thật trong luồng bộ nhớ của tôi?

var 
    serial : word; 
    MS : TMemoryStream; 
const 
    somebytes : array [0..1] of byte = ($72,$72); 
... 
begin 
     MS := TMemoryStream.Create(); 
     try 
     MS.Write(somebytes[0],2); 
     serial := $3E6C; 
     MS.Write(serial,2); 
     finally 
     MS.Free; 
end; 

Sử dụng trình gỡ lỗi tôi thấy rằng trong luồng được thêm giá trị $ 6F32 thay vì $ 3E6C.

3) Nếu tôi gọi

MS.Position := 2; 

và sau đó tôi truy cập PByte (MS.Memory)^tại sao tôi nhận được byte đầu tiên trong dòng thay vì thứ ba?

+3

Để đọc một byte tại một vị trí cụ thể, hãy sử dụng 'MS.Read (SomeByte, 1)' sau khi thiết lập vị trí. –

Trả lời

9

Có cách nào tốt hơn để tạo một mảng byte không?

Đó là cách hoàn toàn hợp lý để làm điều đó, theo quan điểm của tôi.


Tôi thấy rằng trong dòng được thêm vào giá trị $ 6F32 thay vì $ 3E6C.

Kiểm tra lại. Các giá trị chính xác được thêm vào thực tế. Nhưng hãy cẩn thận với các bẫy của các kiểu dữ liệu nhỏ cuối. 4 byte được thêm vào luồng của bạn, theo thứ tự là: $ 72, $ 72, $ 6C, $ 3E.


Tại sao tôi nhận được byte đầu tiên trong dòng thay vì thứ ba?

Vì thuộc tính Memory luôn đề cập đến đầu luồng. Nó không tính đến vị trí hiện tại của luồng.

+0

Cảm ơn rất nhiều vì đã làm mọi thứ rõ ràng – opc0de

+1

Bạn luôn có thể lấy con trỏ làm PByte và sau đó thực hiện P: = Stream.Memory; Inc (P, Stream.Position); để có được con trỏ chính xác –

Các vấn đề liên quan