powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Битовые поля в PHP
36 сообщений из 36, показаны все 2 страниц
Битовые поля в PHP
    #38294399
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В PHP я новичёк и нагуглить по этой теме ничего не смог. Изначально у меня есть набор цифр известного максимального размера (в битах), которые нужно упаковать в 4 байта (dword). В С++ это было проще простого, за счёт возможности создания структур с битовыми полями. Например:
typedef struct {
unsigned int a: 4;
unsigned int b: 16;
unsigned int c: 4;
unsigned int d: 2;
unsigned int e: 6;
} myDwordVariable;
В итоге имею прямой доступ к каждому полю без всяких там математических операторов. В PHP я такого не нашёл :(
Подскажите пожалуйста наиболее удобный для моих целей вариант.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294450
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторабор цифр известного максимального размера (в битах),
что что есть?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294576
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopВ PHP я новичёк и нагуглить по этой теме ничего не смог. Изначально у меня есть набор цифр известного максимального размера (в битах), которые нужно упаковать в 4 байта (dword). В С++ это было проще простого, за счёт возможности создания структур с битовыми полями. Например:
typedef struct {
unsigned int a: 4;
unsigned int b: 16;
unsigned int c: 4;
unsigned int d: 2;
unsigned int e: 6;
} myDwordVariable;
В итоге имею прямой доступ к каждому полю без всяких там математических операторов. В PHP я такого не нашёл :(
Подскажите пожалуйста наиболее удобный для моих целей вариант.

мне этот факт стал интересен, спасибо, не знал что такое бывает. НО... Для чего Вам это... тем более в php? просто интересно :)
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294638
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopВ PHP я новичёк и нагуглить по этой теме ничего не смог. Изначально у меня есть набор цифр известного максимального размера (в битах), которые нужно упаковать в 4 байта (dword). В С++ это было проще простого, за счёт возможности создания структур с битовыми полями. Например:
typedef struct {
unsigned int a: 4;
unsigned int b: 16;
unsigned int c: 4;
unsigned int d: 2;
unsigned int e: 6;
} myDwordVariable;
В итоге имею прямой доступ к каждому полю без всяких там математических операторов. В PHP я такого не нашёл :(
Подскажите пожалуйста наиболее удобный для моих целей вариант.

математические преобразования есть всегда. комьютер не понимает бита, сам проц вообщемто и байта не понимает. просто ты не делал этих операций.

в пхп нету. вишь пхп гуру даже не знают что это такое.

изобретай свой код... побитовые операции и битовый сдвиг есть. :)
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294694
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453nopВ PHP я новичёк и нагуглить по этой теме ничего не смог. Изначально у меня есть набор цифр известного максимального размера (в битах), которые нужно упаковать в 4 байта (dword). В С++ это было проще простого, за счёт возможности создания структур с битовыми полями. Например:
typedef struct {
unsigned int a: 4;
unsigned int b: 16;
unsigned int c: 4;
unsigned int d: 2;
unsigned int e: 6;
} myDwordVariable;
В итоге имею прямой доступ к каждому полю без всяких там математических операторов. В PHP я такого не нашёл :(
Подскажите пожалуйста наиболее удобный для моих целей вариант.

математические преобразования есть всегда. комьютер не понимает бита, сам проц вообщемто и байта не понимает. просто ты не делал этих операций.

в пхп нету. вишь пхп гуру даже не знают что это такое.

изобретай свой код... побитовые операции и битовый сдвиг есть. :)

Ну, это то да. Но учитывая, что такая структура хранения данных сказывается на производительности, думаю является логичным отсутствие данной возможности в php. Серверные технологии рассчитаны на большие нагрузки, а значит наклон идёт на увеличение производительности.

По-этому я и спросил, я зачем это может потребоваться на php? Сервера не страдают от недостатка оперативки обычно, а значит и экономить, и вместо 16 бит тиснуться в 14 нету смысла :)
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294783
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрalex564657498765453пропущено...


математические преобразования есть всегда. комьютер не понимает бита, сам проц вообщемто и байта не понимает. просто ты не делал этих операций.

в пхп нету. вишь пхп гуру даже не знают что это такое.

изобретай свой код... побитовые операции и битовый сдвиг есть. :)

Ну, это то да. Но учитывая, что такая структура хранения данных сказывается на производительности, думаю является логичным отсутствие данной возможности в php. Серверные технологии рассчитаны на большие нагрузки, а значит наклон идёт на увеличение производительности.

По-этому я и спросил, я зачем это может потребоваться на php? Сервера не страдают от недостатка оперативки обычно, а значит и экономить, и вместо 16 бит тиснуться в 14 нету смысла :)

ерунду написал. и нащот памяти, и нащот производительности.
нащот памяти - а сегодня все компьютеры не страдают нехваткой оперативки чтоб два бита экономить.
там где язык интерпретируемый, уже вопрос о производительности кода не стоит.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294790
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopВ PHP я новичёк и нагуглить по этой теме ничего не смог. Изначально у меня есть набор цифр известного максимального размера (в битах), которые нужно упаковать в 4 байта (dword). В С++ это было проще простого, за счёт возможности создания структур с битовыми полями. Например:
typedef struct {
unsigned int a: 4;
unsigned int b: 16;
unsigned int c: 4;
unsigned int d: 2;
unsigned int e: 6;
} myDwordVariable;
В итоге имею прямой доступ к каждому полю без всяких там математических операторов. В PHP я такого не нашёл :(
Подскажите пожалуйста наиболее удобный для моих целей вариант.

кстате учти ж. в пхп один целочисленый тип - интежер. а он может быть и 64 бита, и на сервере скорей всего так и есть. :)
так что будешь баловаться таким образом - обязательно надо чтоб код определял разрядность микропроцессора. Но в пхп ини можно задавать разрядность интеджера.

Так что лучше всего определять по типу

если 0xFF+1 < 0xFF - 8bit
tckb 0xFFFF+1 < 0xFFFF - 16bit
etc
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294796
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

Интерпретация кода, вместо компиляции - это уже другое. Это политика openSource. Помню раньше читал, что собрались классные и умные человечки, и решили, что весь вэб будет на открытых кодах, что бы его было легко править, что бы он был передаваем (так как мало компаний пишут сайт и поддерживают его до последнего, а тем более частники). Но потом пришёл дядя Билл и сказал (как всегда впрочем) "да ну нафиг ваш стандарт" (эм... ну не так конечно, но смысл именно такой). И внедрил в вэб свою платформу ASP.NET, которая является компилируемой. Быстродейственной, но менее удобной для редактирования (не в плане кода, а в плане подготовки к редактированию и требующей установки платного продукта) и неперносимой на некоторые системы (ну или сложно переносимой... логично, ведь компилируемся :) )

Вот так. Так что интерпретация кода вместо его компиляции - это другой вопрос, обусловленный другими аспектами. Вынужденная потеря скорости. В плане же ресурсоёмкости и производительности, уклон делается на производительность, так как винчестера, оперативки у серверов сейчас "ё-маё" :)

P.S. не в обиду тем, кто пишет на .NET, сейчас это тоже уже стандарт многими уважаем. Просто вот так всё было (по тем данным, которые попадались мне). Привёл в пример NET только для того, что бы показать обоснованность принятия решения интерпретации кода на сервере.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294813
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторASP.NET, которая является компилируемой.
Эм? а дядя билл про это знает?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294817
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторASP.NET, которая является компилируемой.
Эм? а дядя билл про это знает?

думаю знает тынц
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294822
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вы там ТОЧНО дальше первой строчки читали?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294825
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

да, конечно читал. Объясните пожалуйста что не так говорю (исходя из данных в данной статье)...
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294828
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда расскажите как у меня без всякой компиляции в DLL работает сайт?
вот напрмер код главной:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using DungeonMaster.BLL;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Threading;
using jabber.client;
using System.Xml;
using System.Xml.XPath;
using System.Net;

public partial class MasterPage : System.Web.UI.MasterPage
{
    static ManualResetEvent mdone = new ManualResetEvent(false);

    protected void Page_Load(object sender, EventArgs e)
    {
        Environment.CurrentDirectory = MapPath("~/App_Files");

        this.Page.Title = this.Page.Title + " | DUNGEONMASTER.RU";

        litModules.Text = Module.GetModuleCount().ToString();
        litModulesInc.Text = "+" + Module.GetNewModuleCount(DateTime.Today).ToString();

        litChars.Text = Player.GetPlayerCount().ToString();
        litCharsInc.Text = "+" + Player.GetNewPlayerCount(DateTime.Today).ToString();

        litPlayers.Text = Cabinet.CountUsers(false).ToString();
        int count = Cabinet.CountUsers(true);

        litPlayersInc.Text = "+" + count.ToString();

        if (this.Page.User.Identity.IsAuthenticated)
        {
            MembershipUser user = Membership.GetUser(this.Page.User.Identity.Name);

            if (user != null)
            {
                // разбаниваем, если пора
                List<Ban> bans = Ban.GetBansByUserName(this.Page.User.Identity.Name, true);

                // если юзер в бане, а действующих банов нет, снимаем все баны
                if ((bans.Count == 0) && ((user.IsLockedOut) || (this.Profile.GetProfile(this.Page.User.Identity.Name).Preferences.isBannedOnForum)))
                {
                    ProfileCommon profile = this.Profile.GetProfile(this.Page.User.Identity.Name);
                    profile.Preferences.isBannedOnForum = false;
                    profile.Save();
                    bool banRet = DungeonMaster.BLL.User.UnBanUser(this.Page.User.Identity.Name);
                    if (user.IsLockedOut)
                        user.UnlockUser();
                    Membership.UpdateUser(user);
                }

                if (user.IsLockedOut)
                {
                    FormsAuthentication.SignOut();
                    this.Page.Response.Redirect("~/Default.aspx");
                }
                else
                {
                    try
                    {
                        HyperLink lnkCabinet = (HyperLink)LoginView3.FindControl("lnkCabinet");
                        lnkCabinet.NavigateUrl = "~/Cabinet/?user=" + this.Page.User.Identity.Name;
                        Literal litUnseenMessages = (Literal)LoginView3.FindControl("litUnseenMessages");
                        litUnseenMessages.Text = PrivateMessage.CountUnseenMessages(this.Page.User.Identity.Name).ToString();
                        if (litUnseenMessages.Text != "0")
                        {
                            lnkCabinet.Style.Add("font-weight", "bold");
                            lnkCabinet.Style.Add("color", "#696");
                        }
                        ProfileCommon profile = Profile.GetProfile(this.Page.User.Identity.Name);
                        if ((!string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"])) && (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != "127.0.0.1"))
                        {
                            profile.Preferences.IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                        }
                        else
                        {
                            profile.Preferences.IP = Request.ServerVariables["REMOTE_ADDR"];
                        }

                        // поработаем с куки

                        if (Request.Cookies["userName"] != null)
                        {
                            HttpCookie aCookie = Request.Cookies["userName"];

                            string[] userNames = null;
                            userNames = profile.Preferences.cookieUsers.Split(';');

                            if (!userNames.Contains(aCookie.Value))
                            {
                                //удаляем старый куки

                                aCookie.Expires = DateTime.Now.AddDays(-1);
                                Response.Cookies.Add(aCookie);

                                // добавляем новое значение в профиль

                                profile.Preferences.cookieUsers += aCookie.Value + ";";
                            }
                        }
                        else
                        {
                            Response.Cookies["userName"].Value = this.Page.User.Identity.Name;
                            Response.Cookies["userName"].Expires = DateTime.Now.AddDays(999);
                        }

                        profile.Save();
                    }
                    catch (Exception exc)
                    {
                    }
                }
            }
            else
            {
                FormsAuthentication.SignOut();
            }
        }

        if (this.Request.Path.Contains("/Forum"))
        {
            lnkForum.Enabled = false;
            lnkForum.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }
        if (this.Request.Path.Contains("/Chat/"))
        {
            lnkChat.Enabled = false;
            lnkChat.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }
        if (this.Request.Path.Contains("/Search"))
        {
            lnkSearch.Enabled = false;
            lnkSearch.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }
        if (this.Request.Path.Contains("/News"))
        {
            lnkNews.Enabled = false;
            lnkNews.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }
        if (this.Request.Path.Contains("/Faq"))
        {
            lnkFaq.Enabled = false;
            lnkFaq.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }
        if (this.Request.Path.Contains("/Community"))
        {
            lnkCommunity.Enabled = false;
            lnkCommunity.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }
        if (this.Request.Path.Contains("/About"))
        {
            lnkAbout.Enabled = false;
            lnkAbout.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }

        if ((this.Page.User.IsInRole("Старший гоблин")) || (this.Page.User.IsInRole("Младший гоблин")))
        {
            lnkAdmin.Visible = true;

            if (this.Request.Path.Contains("/Admin"))
            {
                lnkAdmin.Enabled = false;
                lnkAdmin.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
            }
        }

        if ((this.Request.Path == "/default.aspx")||(this.Request.Path == "/Default.aspx"))
        {
            lnkMain.Enabled = false;
            lnkMain.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        }

        if (this.Page.User.Identity.IsAuthenticated)
        {
            /*ProfileCommon profile = Profile.GetProfile(this.Page.User.Identity.Name);
            profile.Preferences.LastActivityDate = DateTime.Now;
            profile.Save();*/
            DungeonMaster.BLL.User.UpdateUserOnLine(this.Page.User.Identity.Name);
        }
        
        if (!IsPostBack)
        {
            Random rnd = new Random(DateTime.Now.Millisecond);
            if (rnd.Next(0, 4) == 1) // кому повезет...
            //if (true)
            {
                List<BotMessage> botMessages = BotMessage.GetBotMessagesByType(1);
                // если есть что слать и последнее не создано за последние 2 мин
                if (botMessages.Count > 0)
                {
                    try
                    {
                        //ICQLogin();
                        JabberClient jclient = new JabberClient();
                        jclient.User = "dm-bot";
                        jclient.Server = "jabber.ru";
                        //jclient.Server = "qip.ru";
                        jclient.Password = "2oo32OO4";
                        jclient.RequiresSASL = false;
                        jclient.SSL = false;
                        jclient.AutoStartTLS = false;
                        jclient.RequiresSASL = false;
                        bedrock.net.AsyncSocket.UntrustedRootOK = true;

                        //jclient.LocalCertificate.

                        //jclient.Port = 443;
                        jclient.AutoRoster = false;
                        jclient.AutoPresence = false;
                        jclient.AutoReconnect = -1;

                        jclient.OnError += new bedrock.ExceptionHandler(j_OnError);

                        jclient.OnAuthenticate += new bedrock.ObjectHandler(jclient_OnAuthenticate);
                        jclient.OnConnect += new jabber.connection.StanzaStreamHandler(jclient_OnConnect);
                        jclient.OnAuthError += new jabber.protocol.ProtocolHandler(jclient_OnAuthError);

                        jclient.Connect();

                        if (true)
                        {
                            jclient.OnReadText += new bedrock.TextHandler(j_OnReadText);
                            jclient.OnWriteText += new bedrock.TextHandler(j_OnWriteText);
                        }


                        mdone.WaitOne();

                        // logout cleanly
                        jclient.Close();
                    }
                    catch
                    { }
                }               
            }
        }
    }

    protected void btnLogOut_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
    }
   
    static void j_OnWriteText(object sender, string txt)
    {
        if (txt == " ") return;  // ignore keep-alive spaces
        //Console.WriteLine("SEND: " + txt);
    }

    static void j_OnReadText(object sender, string txt)
    {
        if (txt == " ") return;  // ignore keep-alive spaces
        //Console.WriteLine("RECV: " + txt);
    }


    void jclient_OnAuthError(object sender, System.Xml.XmlElement rp)
    {
        //throw new NotImplementedException();
    }

    void jclient_OnConnect(object sender, jabber.connection.StanzaStream stream)
    {
        //throw new NotImplementedException();
    }

    static void jclient_OnAuthenticate(object sender)
    {
        // Sender is always the JabberClient.
        JabberClient j = (JabberClient)sender;

        List<BotMessage> botMessages = BotMessage.GetBotMessagesByType(1);

        foreach (BotMessage msg in botMessages)
        {
            try
            {
                j.Message(msg.UIN, msg.Message);
                bool done = BotMessage.UpdateBotMessage(msg.Id, DateTime.Now);
            }
            catch (Exception ex)
            {
                if (msg.UIN.Length == 0)
                    BotMessage.UpdateBotMessage(msg.Id, DateTime.Now);
            }
        }
        

        //j.Message("yposadskiy@unact.ru", "test");

        // Finished sending.  Shut down.
        mdone.Set();
    }

    static void j_OnError(object sender, Exception ex)
    {
        // There was an error!
        //Console.WriteLine("Error: " + ex.ToString());

        // Shut down.
        mdone.Set();
    }
}

...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294830
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот прям так и работает, из текстовика, как PHP
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294832
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowвот прям так и работает, из текстовика, как PHP

А Вы после изменения 1 буковки кода попробуйте зайти на сайт. Первый заход будет занимать больше времени, чем последующие. Это и будет компиляция кода сайта.

Просто там код компилируется не программистом вручную, а автоматом при первом запуске.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294833
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, процедуру первого запуска видел лично, так как на смену мне в компанию, где я работал, пригласили программиста на NET платформу (хотели на php продолжить, но он реально классно шарит, по-этому решили с ним попробовать). Так вот, он мне лично показывал как это всё работает и объяснял, почему так долго запускается первый раз.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294836
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так, с открытыми кодами разобрались. оказывается в самом что ни на есть пропиетарном Микрософте самые что ни на есть открыты коды. с компиляцией сами почитаете или тоже разберем?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294841
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

К сожалению уже с телефона, потому пока отвечать не буду на прошлое сообщение, так как сложно аргументировать не давая ссылок нормальных. А вот по поводу компиляции, с радостью почитал бы Ваши доводы (по формулировке понимаю, что хотите поспорить)
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294842
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
быстро ты слился
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294845
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

Ну так ответь. Я то утром аргументы то подкачу свои. Не знаю как там у Вас, а тут в Москве 2.40 однако :). С чего мне ещё в такое время как не с телефона сидеть? Выпучив глаза перед компом? Нее. Явно не для меня.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38294867
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowтак, с открытыми кодами разобрались. оказывается в самом что ни на есть пропиетарном Микрософте самые что ни на есть открыты коды. с компиляцией сами почитаете или тоже разберем?

Итак, с открытыми кодами и компиляцией... Надеюсь английский знаем... Итак, ссылки:
общие положения публикации сайтов на asp.net
возможные варианты публикации сайтов на asp.net
не просто откуда-то, а с оригинального сайта msdn.microsoft.com. Так Вот, давайте обсудим официальные ссылки, документации к продукту... а то "у меня" - это не дело... ))) Вы могли просто сайт публиковать вместе с кодами (читаем... там есть такая возможность). Очень хочу увидить, что на это ответите... Вы вывели какую-то непонятную "истину" и обвинили меня в неправоте, даже не почитав ссылку видимо (где несколько раз повторяется, что код не является открытым и что он компилируется).
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295576
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopВ PHP я новичёк и нагуглить по этой теме ничего не смог.
а что там гуглить? открываем доку поддерживаемых типов и видим, что пхп поддерживает а что нет

если прочитаете ссылку выше, то поймете что dword как тип пхп неподдерживает.
но. если нельзя но очень хочется - то можно. битовые сдвиги есть, для упаковки читаем про функции pack() / unpack() флаг L и т.д.
можно написать свой класс, который будет на лету это делать, либо поищите готовый, может уже ктото реализовал, может даже в виде расширения к пхп...

а вообще пхп высокоуровневый язык, если вы успели заметить, и он не особо заточен для работы напрямую с битами. но коечто делать позволяет
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295631
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

поддержу. Есть все побитовые операции. Там даже отдельного класса генерить особо и не надо, а зачастую и не требуется.

По-поводу "ненужной экономии двух байт": не соглашусь. "Копейка - рупь бережет". На серверах, из-за такого подхода, как правило мозгов не хватает уже при мало-мальски серъезной нагрузке. Ни при какой оперативе.
Это большой миф Г-кодеров в своё оправдание.

Как пример: побайтное хранение каких=нибудь "статусов" - можно в БД выделить тип boolean или что ещё в один байт. Казалось бы "нафига экономить" и лепить побитовые операции? Однако:

при количестве статусов, хотя бы 8 штук, имеем 8 полей. Как правило "статус" - это такая фигня, которая часто ограничивает условия выборки (и отдай мне те, которые ещё не проверены, или ещё не удалены и т.п.)... но на 8 полей, уже приходится накладывать индекс на каждое(!) поле, что уже далеко не один байт на поле...
... и это как ни странно, только "начало": далее надо усложнять запросы, добавляя условия по И/ИЛИ на каждое отдельное поле... удлинять ширину выборки (несколько полей), что уже "внезапно" значительно снижает скорость отдачи (даже по внутреннеей петле сетевого интерфейса - он все равно используется и яваляется самым узким местом в связках "БД - клиент"), усложнять логику клиента, поскольку результат - уже несколько полей объекта "Запись" к примеру и проверки надо вести также расширяя код по И/ИЛИ... а, учитывая что ПХП выделяет память блоками по килобайту и более... рост потребляемой памяти может и вовсе оказаться несоизмеримым.

... в то же время, хранение битовым набором - поддерживается большинством БД (даже в Мускуле есть тип данных set - до 64 бит, а в varbinary - ваще можно "скока угодно"), и "сложность" задачи - это просто банальное незнание и нежедлание узнать работу с битовыми операциями и логическими выражениями.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295743
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрalex564657498765453,

Интерпретация кода, вместо компиляции - это уже другое. Это политика openSource. Помню раньше читал, что собрались классные и умные человечки, и решили, что весь вэб будет на открытых кодах, что бы его было легко править, что бы он был передаваем (так как мало компаний пишут сайт и поддерживают его до последнего, а тем более частники). Но потом пришёл дядя Билл и сказал (как всегда впрочем) "да ну нафиг ваш стандарт" (эм... ну не так конечно, но смысл именно такой). И внедрил в вэб свою платформу ASP.NET, которая является компилируемой. Быстродейственной, но менее удобной для редактирования (не в плане кода, а в плане подготовки к редактированию и требующей установки платного продукта) и неперносимой на некоторые системы (ну или сложно переносимой... логично, ведь компилируемся :) )

Вот так. Так что интерпретация кода вместо его компиляции - это другой вопрос, обусловленный другими аспектами. Вынужденная потеря скорости. В плане же ресурсоёмкости и производительности, уклон делается на производительность, так как винчестера, оперативки у серверов сейчас "ё-маё" :)

P.S. не в обиду тем, кто пишет на .NET, сейчас это тоже уже стандарт многими уважаем. Просто вот так всё было (по тем данным, которые попадались мне). Привёл в пример NET только для того, что бы показать обоснованность принятия решения интерпретации кода на сервере.

да какая нафиг переносимость. исходни если есть то и в перёд, а если нету..ну так наврено нельзя переносить куда хочеться - это чьёто.

а вот что для опенсорса это полезно, то да... ибо ктото может начинать распространять скомпиленый без исходников...и вроде опен сорс, можешь делать что хочешь, ну или с ошибками исходники... а реально совершенно левые смогут на себя тянуть одеяло..

так что нащот переносимости не соглашуссь, а вот опенсорс - поддержвию :)
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295838
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрПо-этому я и спросил, я зачем это может потребоваться на php? Сервера не страдают от недостатка оперативки обычно, а значит и экономить, и вместо 16 бит тиснуться в 14 нету смысла :)
Вопрос не в экономии. Веб-приложение должно по определённым правилам генерить 4-ёх байтовый номер для устройства, в который должны быть заложены некоторые его параметры. Параметров 6, при этом разных размеров, и без разбиения по битам их в 4 байта не вставить )


Arhat109r u,

поддержу. Есть все побитовые операции. Там даже отдельного класса генерить особо и не надо, а зачастую и не требуется.

Да побитовые операции - это понятно. Они где угодно есть. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295855
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

По поводу переносимости... Знал это только со слов, так как уже говорил, asp.net ни разу не юзал.
Потому решил загуглить... и вот первая же открытая ссылка (кроме тех, где на 10 страницах рассказывается как настроить linux сервер под работу с asp)
английское обсуждение (сорри... русского не нашёл)

Как видим, в любой момент можно столкнуться с ситуацией, когда написанный на asp.net проект (в windows) не запуститься в linux (так как в линуксе mono поддерживает малую часть функций данного фреймворка)

P.S. Не забываем, что mono - это не продукт от майкрософта, а значит можно считать, что .net не переносима на линукс сервер (ведь mono - это бесплатная штука, которую в любой мемент могут перестать разрабатывать и поддерживать и всё :) )
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295890
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.
стольже удобного - НЕТ, но это возможно. но придется многое делать вручную
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295957
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopДа побитовые операции - это понятно. Они где угодно есть. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.

Насколько мне известно, ничего подобного в php нету... Но учитывая, что размер структуры меньше размера integer:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class DeviceData{

  const A = 0xF;
  const B = 0xFFFF0;
  const C = 0xF00000;
  const D = 0x3000000;
  const E = 0xFC000000;

  protected $data = 0;
  function __contsruct(){}
  function __destruct(){}
  function setData($val, $mask){
    if ($mask==0) return $this->data;
    $m=0;
    $off=0;
    do{
      $off++;
      $m = ($m << 1) | 1;
    }while(($mask & $m) == 0);
    $off--;
    $this->data = ($this->data & ~$mask) | (($val >> $off) & $mask);
    return $this->data;
  }
}



В принципе за 5 минут писано... Может где ошибся, не проверял... По аналогии (только легче немного) чтение по маске... Маски предопределяем в классе (для удобства)... и всё. Вот удобный инструмент (ограничивающийся размеров integer).
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38296117
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да... как чувствовал, что ошибся ))

написал:
Код: php
1.
$this->data = ($this->data & ~$mask) | (($val >> $off) & $mask);



а надо:
Код: php
1.
$this->data = ($this->data & ~$mask) | (($val << $off) & $mask);
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297551
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрnopДа побитовые операции - это понятно. Они где угодно есть. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.

Насколько мне известно, ничего подобного в php нету... Но учитывая, что размер структуры меньше размера integer:
Как меньше? Все битовые поля структуры в сумме занимают 4 байта. Но в принципе не суть.

Програмёр
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class DeviceData{

  const A = 0xF;
  const B = 0xFFFF0;
  const C = 0xF00000;
  const D = 0x3000000;
  const E = 0xFC000000;

  protected $data = 0;
  function __contsruct(){}
  function __destruct(){}
  function setData($val, $mask){
    if ($mask==0) return $this->data;
    $m=0;
    $off=0;
    do{
      $off++;
      $m = ($m << 1) | 1;
    }while(($mask & $m) == 0);
    $off--;
    $this->data = ($this->data & ~$mask) | (($val >> $off) & $mask);
    return $this->data;
  }
}



В принципе за 5 минут писано... Может где ошибся, не проверял... По аналогии (только легче немного) чтение по маске... Маски предопределяем в классе (для удобства)... и всё. Вот удобный инструмент (ограничивающийся размеров integer).
Извиняюсь за нубство (я в основном системный программист и на PHP практически не писал), но можно немного пояснить код?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297583
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopИзвиняюсь за нубство (я в основном системный программист и на PHP практически не писал), но можно немного пояснить код?
что именно вам непонятно?
ветвление, цикл, операции арифметические,логические, битовые сдвиги...
или сам алгоритм?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297632
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopИзвиняюсь за нубство (я в основном системный программист и на PHP практически не писал), но можно немного пояснить код?

Хм... Ну каг бы... )) это вообще-то какраз ближе к системному программированию, чем к php (из php тут только синтаксис :) ). Я уже несколько лет в php программирую, но мне только 1 раз приходилось делать подобное. А вот как раз знаю как это делать, потому что в своё время сильно увлёкся asm'ом и за месяц перечитал кучу всякой инфы об низкоуровневой работе с памятью (и многое другое).

Алгоритм тут простой: задаём маску для каждого значения в структуре. на вход в функцию получаем число и маску. Потом определяем на сколько бит надо сместить число, которое подали (ведь, если число 0xA9, а маска 0xFF00, то в итоге наше значение должно быть записано как 0xA000). А дальше одной командой очищаем те биты в структуре, которые хотим записать, и выполняем сложение (логическое) с поданным на вход числом, смещённым и пропущенным через маску.

Думаю Вы должны понять, по какому принципу я предопределил маски, но если вдруг не понятно - пишите.

P.S. в данном случае структура меньше интежера. Тут вся штука в том, что в php тип int подразумевает (по умолчанию, как уже заметили можно и изменить) что-то подобное прикладному longint или даже int64 (не уверен... не проверял размерность никогда... 32bit вполне достаточно было). Так что в данном случае указанная структура легко поместиться в integer.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297655
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ведь, если число 0xA9, а маска 0xFF00, то в итоге наше значение должно быть записано как 0xA000 0xA900
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38300194
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, в коде разобрался :) Вроде бы работает как надо (при тестировании, проверял калькулятором), в реальных условиях пока не проверил.

ПрограмёрP.S. в данном случае структура меньше интежера. Тут вся штука в том, что в php тип int подразумевает (по умолчанию, как уже заметили можно и изменить) что-то подобное прикладному longint или даже int64 (не уверен... не проверял размерность никогда... 32bit вполне достаточно было). Так что в данном случае указанная структура легко поместиться в integer.
А вот этого понять не могу. В вашей же структуре маска 0xFC000000 смещает на последние 6 бит из 32-ух. Соответственно если я по этому смещению запишу 0x3F, то как получившееся число может получиться меньше 4ёх байт?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38300353
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop,

в моём сообщении "меньше" стоит понимать как "меньше или равно" :) В указанном Вами случае получится заполнение ровно 4-ёх байт.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38301178
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop,

Не саморекламы ради, а популяризации для:
http://pecl.php.net/package/Bitset
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Битовые поля в PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]