30/09/2018, 21:22

Convert ByteArray to Decimal

Mình bên điện tử, các bạn bên ngành IT cho mình hỏi vấn đề này với. Mình có làm 1 cái đồ án môn học. Đại khái là như thế này mình có 1 số dữ liệu trong bộ nhớ 1 con IC, mình muốn đọc nó ra và vẽ tín hiệu được tính toán ra từ nó. Nhưng khi đọc thì những giá trị nào nhỏ hơn 128 (0x80) thì hiển thị đúng, còn nếu lớn hơn thì lại hiển thị là số âm. Mình nghĩ mình viết chương trình (chương trình mình tìm trên mạng và chỉ chỉnh sửa lại cho phù hợp với cái bài tập của mình) bị sai, và hiểu bit thứ 8 là bit dấu (+/-) nên khi hiển thị sai luôn.

void SL900ASignal::on_pb_ReadMeas_clicked ( )
{	

	QByteArray answer;
	int temp, j=0;
	char buffer1[16], buffer2[16];
	char *intStr, *cNumber;
	itsGen2Res = itsParent->readUserMemory(itsCoolLogError, sp_readAddress->value() , answer);
	j = answer.length();
	//temp = answer[0];

	for(int i=0; i<j; i++){
		temp = answer[i];
		
		intStr  = _itoa(temp, buffer1, 10);     //Ham chuyen nay co van de
		cNumber = _itoa(i, buffer2, 16);   

		itsParent->logMessage("Read Blocks " + QString("%1").arg(sp_readAddress->value(), 1, 16, QLatin1Char('0')) + cNumber + ": " + intStr);
	}
}

Đây là hàm readUserMemory() ở trên:

Gen2ReaderInterface::Gen2Result SL900AMainDialog::readUserMemory ( CoolLogError &error, unsigned int address, QByteArray &answer )
{

    ComByteArray mem;
    bool ok;
    ComByteArray passw = ReaderInterface::stringToEpc(le_Password->text(), &ok);
    Gen2Tag tag;
    tag.epc = tagIdEdit->text();

	itsGen2Res = itsGen2Reader->readFromTag(tag, MEMORY_BANK::MEM_USER, address, passw, 4, false, mem);

    answer = mem.toQByteArray();
    
    return itsGen2Res;
}

Mình nghĩ là hàm chuyển từ ByteArray sang Decimal mình viết ở trên sai, bác nào biết chỉ mình với.

Cảm ơn.

Củ Chuối viết 23:22 ngày 30/09/2018

intStr = _itoa(temp&0xff, buffer1, 10);

thử đổi lại ntn xem có ổn ko bạn?

BiNa2605 viết 23:23 ngày 30/09/2018

Cảm ơn bạn nhé, đã sửa được lỗi rồi. Bạn giải thích cho mình tại sao phải là “temp&0xff” được không?

Củ Chuối viết 23:35 ngày 30/09/2018

0xff ra hệ 10 là 255. (dấu & bạn đổi thành dấu + cũng được và 0xff đổi thành 255 cũng được)
Theo mình, ko rõ là chính xác 100% ko nha : 1 byte có 8 bit, 1 bit lưu dấu nên tối đa chỉ lưu đc [-127,+127], do đó bạn phải + thêm 255 để chuyển nó về số dương.
VD: 128 <-> -127, 200 <-> -55

BiNa2605 viết 23:31 ngày 30/09/2018

Bạn đoán đúng bệnh của mình rồi đó. Thanks bạn.

Bài liên quan
0