• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Fantilyre · Aug 02, 2017 at 08:51 AM · c#unity 5windowsformpipe

UTF8 string acquired through NAMEDPIPES unrecognized by Unityengine

Hi,

the problem is quite simple yet I can't find a solution. I have a string value "sam" that I send through named pipes to my unity application. I receive the string and can print it in the log without issues, but if I use that string to compare with another string of same value created in unity itself (using IF or SWITCH functions), unity finds they don't match.

My code, server side (Winform app):

 dataWriter("sam");
 
 void dataWriter(string dataToSend)
         {
             byte[] _buffer = Encoding.UTF8.GetBytes(dataToSend);
             pipeServer.BeginWrite(_buffer, 0, _buffer.Length, new AsyncCallback(asyncWriter), pipeServer);
         }
 
         private void asyncWriter(IAsyncResult result)
         {
             pipeServer = (NamedPipeServerStream)result.AsyncState;
             pipeServer.EndWrite(result);
             pipeServer.WaitForPipeDrain();
             pipeServer.Flush();
         }


On the client side (unity app) :

 if (pipeStream.IsConnected)
         {
             Debug.Log("Start Reading");
             pipeStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(readCallBack), pipeStream);
         }
 
 private void readCallBack(IAsyncResult result)
     {
 
         pipeStream.EndRead(result);
         string stringData = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
 
         Debug.Log("Data received : " + stringData); /// Will successfully print "Data received : sam" in unity logs
         if (stringData == "sam")   //// Will be FALSE
         {
             Debug.Log("Data received = sam");
         }
         else
         {
             Debug.Log("Data received does not equal SAM "); // Will print this, because it finds stringData is not equal to "sam"
         }
     }


I tried alot of things: change the encoding format, tried to transform the IF variable from string to byte to string using UTF8 encoding in hopes of having the same string as the data received, tried to trim the BOM from the string if there was any but apparently there is none already, etc.

Please save me from hell on earth!!

Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image revolute · Aug 02, 2017 at 09:04 AM 0
Share

Odd. Can you write byte values for both "GetBytes(dataToSend)" and "buffer"? $$anonymous$$ight worth reading the difference.

2 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by Fantilyre · Aug 02, 2017 at 09:49 AM

Ok, well, solved it I guess. Its always when you come to ask for help stuff starts sorting itself out.

Like said in my answer to AdrienPlayerium, the issue was with the byte length. For now I send one byte more specifying the expected length of my string and I only keep that part and it works. I will need to change my solution in the near future because right now it will only work for informations that are no longer than 9 bytes total.

Server :

 void dataWriter(string dataToSend)
         {
             int dataLen = dataToSend.Length;
             byte[] buffer = new byte[dataLen+1];
             string dataL = dataLen.ToString()+dataToSend;
             buffer = Encoding.UTF8.GetBytes(dataL);
             pipeServer.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(AsyncSend), pipeServer);
         }

Client :

 string stringData = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
 int dataLen = Convert.ToInt32(Encoding.UTF8.GetString(buffer, 0, 1));
 string goodData = Encoding.UTF8.GetString(buffer, 1, dataLen);

So basically later on I will do it another way, which is have a specific char to split my data (for example "-"), use the part before the char as my expected byte length and the part after the char being the actual data I want to send/receive.

Thanks anyway !

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by adrienPlayerium · Aug 02, 2017 at 09:02 AM

@Fantilyre , you can check if String.Equals() give you false as well, look into == operator as well, in the debugger if you can step by step, to see which assertion fails maybe there is /0 character or something ~~ Good luck~

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Fantilyre · Aug 02, 2017 at 09:27 AM 0
Share

Thanks for the answer :) .

I tried String.Equals(), returns FALSE just like the == operator. Although with further testing I narrowed the issue to the buffer.Length . It returns a length of 255 while it should return a length of 3... I am not sure how to control the byte length is the same when it arrives as when it was sent though :/ . I could send a first byte that specifies the expected length ? Not sure.

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

389 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Windows Universal IAP 0 Answers

How to change properties of the standalone player form 1 Answer

Coroutine works in editor, but not in build Windows application 0 Answers

Play Video from byte array (mp4) in UWP 1 Answer

Windows Forms freezes Unity game 1 Answer

  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges