I have a question about RAM information - How do you get its name?
So far, from Win32_PhysicalMemory
and Win32_PhysicalMemoryArray
classes I was able to get most of the info except the name (display name; eg. CRUCIAL BALLISTIX SPORT LT RED)
The platform I'm coding on is .NET WinForms - C#.
References I looked at
-
If this occurs, one needs to refer to the
How will this work? In C#, we can use
&
for logicalAND
operations. Likewise,|
is used for logicalOR
operations.To put this into practice, let's start with a test hex value:
85
.HEX: 85 DEC: 133 BIN: 1000 0101
We need to determine what value we can use with a logical
AND
that will change the 8th bit to0
. The bit order is[8][7][6][5][4][3][2][1]
(Little Endian)To Determine Endianness: (PowerShell)
[System.BitConverter]::IsLittleEndian
The following will change the parity bit to 0 when odd parity is used.
GetValueWithoutParity:
private uint GetValueWithoutParity(uint originalValue) { //values have odd parity //if number of 1's is odd, then eighth bit = 0 //if number of 1's is even, then eighth bit = 1 //we need to zero out the eighth bit in order to get the actual value //ie: in order to get the value of bits 0-7 uint mask = 0x7F; //01111111 //logical AND - search "Bitwise operators" for more info return originalValue & mask; }
If one has a value without parity, one can get the value after adding the parity bit by doing the following:
GetValueWithParity:
Note: The code for this method is from here.
private uint GetValueWithParity(uint originalValue) { //values have odd parity //if number of 1's is odd, then eighth bit = 0 //if number of 1's is even, then eighth bit = 1 string binaryVal = Convert.ToString(originalValue, 2); byte[] numberAsByte = new byte[] { (byte)originalValue }; //create new instance and set value BitArray bits = new BitArray(numberAsByte); int onesCount = 0; //count number of 1's for (int i = 0; i < 8; i ) { if (bits[i]) onesCount ; //increment } if (onesCount % 2 == 0) { //set the left most bit for odd parity bits[7] = true; } //copy bits.CopyTo(numberAsByte, 0); return numberAsByte[0]; }
Now, we're able to decode the hex value into a value without parity. After removing the parity bit for
85
, we've determined the value without parity is5
. As previously mentioned, the first hex value is the number of continuations, and the second hex value is the (1-based) entry/index number. (if there are 5 continuations, that means that the desired value is in the 6th bank/group).After decoding the second value, we find the (1-based) index/entry, is
27
Before proceeding, let's create some classes to store our data in. I've decided that I'll store the data as JSON. You could use XML, if you like.
Download/install NuGet package:
Newtonsoft.Json
- In VS menu, click View
- Select Solution Explorer
- In Solution Explorer, right-click your <project name>, select Manage NuGet Packages.... Click Browse. In search box, type Newtonsoft.Json. Click Install. If a prompt appears, click Yes.
Create a class: (name: Manufacturer)
public class Manufacturer { [JsonProperty(PropertyName = "groupNumber")] public int GroupNumber { get; set; } [JsonProperty(PropertyName = "names")] public List<String> Names { get; set; } = new List<String>(); }
Create a class: (name: RootObjectJson)
public class RootObjectJson { [JsonProperty(PropertyName = "manufacturer")] public List<Manufacturer> Manufacturers { get; set; } = new List<Manufacturer>(); }
Add the following using statements to your classes:
- using System;
- using System.Collections.Generic;
- using Newtonsoft.Json;
ToDo: Load data into the classes. This repository may be useful.
Note: When using the code below, it's necessary to align data so that the desired data starts at index 1. A simple way of doing this is to add filler data (data that won't be used) in index 0.
Example:
The following represents a data entry in index 0. This data won't be used, but is used to make it seem that our data is using a 1-based index.
{ "manufacturer": [ { "groupNumber": 0, "names": [ "None" ] } ] }
Then given a value (ex:
859B
), one can do something similar to the following to retrieve the desired data.Note: If you don't want to use "filler data" (place unused data in index 0), change the indices in the method below.
DecodeManufacturer:
private void DecodeManufacturer(string manufacturerVal, RootObjectJson root) { uint groupNumber = 0; uint numberOfContinuations = 1; uint entryNumber = 1; if (!String.IsNullOrEmpty(manufacturerVal)) { if (manufacturerVal.Length > 2) { uint currentVal = 0; //ToDo: ensure each hex value is 2 chars //if necessary, pad with a leading '0' for (int i = 0; i < manufacturerVal.Length; i =2) { //Debug.WriteLine($"i = {i} manufacturerVal.Length: {manufacturerVal.Length}"); //get decimal value of hex value string currentStr = manufacturerVal.Substring(i, 2); string currentStrAsHex = String.Format("0x{0}", currentStr); //convert to uint currentVal = Convert.ToUInt32(currentStrAsHex, 16); //Debug.WriteLine($"currentStrAsHex: {currentStrAsHex} currentVal: {currentVal}"); if (i == 0 && manufacturerVal.Length > 2 && manufacturerVal.Length <= 4) { numberOfContinuations = GetValueWithoutParity(currentVal); //set value groupNumber = numberOfContinuations 1; //Debug.WriteLine($"numberOfContinuations: {numberOfContinuations} groupNumber: {groupNumber}"); } else if (i == 2 && manufacturerVal.Length > 2 && manufacturerVal.Length <= 4) { entryNumber = GetValueWithoutParity(currentVal); //Debug.WriteLine("entryNumber: " entryNumber); Debug.WriteLine($"numberOfContinuations: {numberOfContinuations} groupNumber: {groupNumber} entryNumber: {entryNumber}"); //need to convert to int to use as an index for the lists int groupNumberInt = (int)groupNumber; int entryNumberInt = (int)entryNumber; if (groupNumberInt < root.Manufacturers.Count && entryNumber < root.Manufacturers[groupNumberInt].Names.Count) { Debug.WriteLine($"Manufacturer Name: '{root.Manufacturers[groupNumberInt].Names[entryNumberInt]}' Hex: {GetValueWithParity(entryNumber).ToString("X2")} Hex2: {GetValueWithParity2(entryNumber).ToString("X2")}"); } else { Debug.WriteLine("Error: Invalid input."); } } } } } }
Resources:
- Bitwise and shift operators (C# reference)
- How to check whether a system is big endian or little endian?
- Converting Hex string to Int in C#
- Program to find parity
- C# Parity Bits from a Binary Number
- Convert an integer to a binary string with leading zeros
- What is the JEDEC JEP-106 Manufacturer ID Code and how does Arm use it?
- How to clear the most significant bit?
- Convert String to Hex and Hex to String in .NET
- Serializing and Deserializing JSON
- Serialization Attributes