دسترسی به چهاربایت float32 در پایتون
درود و وقت بخیر
معمولا این جور سوالات رو با گوگل کردن پیدا میکردم ولی وضعیت اینترنت چاره ای نذاشته...
هدف اینه که یک متغییر ممیز شناور 32 بیتی را به چهار متغیر 8 بیتی تبدیل کنیم.
در زبان سی با union ها (اگر درست نوشته باشم) انجامش میدادیم:
union{
float a;
unsigned char binary_a[4];
}
(البته شبه کد رو ذهنی نوشتم شاید اشتباه باشه ولی خب منظورمو میرسونه)
همین کارو میخوام با پایتون انجام بدم و ترجیحا بدون numpy و... چون با اینترنت ملی نمیدونم چطوری پکیج نصب کنم :گیج:
ممنون
نقل قول: دسترسی به چهاربایت float32 در پایتون
عدد رو ببر در مبنای باینری و استرینگش کن بعدا با slice به چهار قسمت تبدیلش کن
نقل قول: دسترسی به چهاربایت float32 در پایتون
تغییر مبنا؟
اگر خودم تغییر مبنا بدم که میشه fixed point و داده از دست میره
اگر روش خاصی در پایتون هست که ممیز شناور رو تبدیل کنه ممنون میشم اشاره کنید
در جاوا و سی شارپ میشد که یک آبجکت رو serialize کنیم. اینجا با پایتون نمیشه همچین حرکتی زد؟
نقل قول: دسترسی به چهاربایت float32 در پایتون
نقل قول:
نوشته شده توسط
salehjg
درود و وقت بخیر
معمولا این جور سوالات رو با گوگل کردن پیدا میکردم ولی وضعیت اینترنت چاره ای نذاشته...
هدف اینه که یک متغییر ممیز شناور 32 بیتی را به چهار متغیر 8 بیتی تبدیل کنیم.
در زبان سی با union ها (اگر درست نوشته باشم) انجامش میدادیم:
union{
float a;
unsigned char binary_a[4];
}
(البته شبه کد رو ذهنی نوشتم شاید اشتباه باشه ولی خب منظورمو میرسونه)
همین کارو میخوام با پایتون انجام بدم و ترجیحا بدون numpy و... چون با اینترنت ملی نمیدونم چطوری پکیج نصب کنم :گیج:
ممنون
متاسفانه تسلطی به پایتون ندارم، فقط در حد دو روز راهنماشو خوندم. شاید راه حل بهتری هم باشه ولی خروجی باینری این رو با مقادیر معادل #C مقایسه کردم و جواب داده :
یک عدد اعشاری مثل n داریم :
>>> n : float = 1.23
کتابخانه مربوط به struct رو وارد می کنیم :
from struct import *
عدد رو به آرایه ای از بایت ها تبدیل می کنیم که معادل float زبان C باشه که 32 بیتی است، اگر بجای 'f' از 'd' استفاده می کردیم معادل double زبان C میشد که 64 بیتی است.
b : bytes = pack('f', n)
حالا در b چهار بایت مجزا شده اند، b[0] و b[1] و b[2] و b[3] ولی اگر بخواهید می توانید در یک عدد 32 بیتی ترکیب شان را هم داشته باشید :
x : int = int.from_bytes(b, byteorder='little', signed=False)